Hey Pablo,

Sorry, you are completely correct: I accidentally typed transaction when I 
meant connection. My bad.

I don’t understand what you mean by connections having to be global when 
dealing with an RDBMS. It is true that you normally want to pool them to 
conserve resources, and that pooling may be global in nature - but it also may 
not be. Quality of Service demands often necessitate multiple pools to the same 
data-source to be created and accessed independently. You also, sometimes, want 
to access different databases from the same application, that gets much harder 
- and your code becomes less general if you need to reference specific global 
connection-pools.

I’m also a little confused by your suggestion that it would be impossible to 
enclose each test in a transaction. The article you point to shows one way. 
Another way I’ve used often is to declare a var holding a ref and in a fixture 
initialise/close a connection around the test. The test function then 
derefences the var holding the connection passing it into the function under 
test. This does make it impossible to run tests in parallel, but that’s not 
something I’ve ever tried. Creating tests that access shared resources is a 
little bit uglier than in a OO language where you could more easily reference 
an instance variable but it isn’t much worse, and a little macro-pixie dust can 
make it all go away.

I will say that it has been my experience that you don’t find yourself passing 
database connection pools around everywhere. As your code grows you naturally 
extract components/protocols that wrap all that up. Your ring-handler doesn’t 
need a connection it needs some sort of data-access component. That component 
needs a connection/connection pool but that can be passed in at construction 
time. I have feared the creation of functions that need an ever increasing 
number of parameters that need to be passed on, but it isn’t something I find 
happens in practice. Of course, YMMV.

I would respectfully suggest that the solutions are not the same. My way has no 
global state and functional purity-lite (those connections are rarely 
idempotent): which are obviously only theoretical benefits. But it does work 
when I do it; I like my code, I don’t have problems working with it, and I 
genuinely don’t face any of the challenges you’re struggling with.



R.



> On 3 Aug 2015, at 03:19, J. Pablo Fernández <pup...@pupeno.com> wrote:
> 
> Rob,
> 
> The transactions are not global, the transactions are local. Connections are 
> global and there's no way around it with the constraints of a traditional 
> RDBMs. Your idea of making the global connection unavailable for code that's 
> in the context of a transaction would prevent the errors I'm trying to 
> prevent but you would still required to pass the connection around, which in 
> a webapp, means that the whole chain of function calls, pretty much 
> everything, would have a database connection. That is ugly in some cases, 
> impossible in others.
> 
> A piece of code that would be impossible is to enclose each test in a 
> transaction using clojure.test: 
> http://stackoverflow.com/questions/31735423/how-to-pass-a-value-from-a-fixture-to-a-test-with-clojure-test
>  
> <http://stackoverflow.com/questions/31735423/how-to-pass-a-value-from-a-fixture-to-a-test-with-clojure-test>
> 
> Furthermore, I don't think this solution gains you any purity, you still have 
> a global estate and you are hiding it away when starting a transaction. My 
> proposal was to make it work instead of hiding it. They are rather equivalent 
> from the complexity point of view.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to