I just ran across Apache CXF and at first glance, I’m impressed. If it runs in an OSGI environment without too much trouble, it seems like it’ll offer a simple mechanism to add rest/soap/jms remoting while allowing for dynamic service redeployments during development.
November 13, 2008
September 14, 2008
Replay requires Perian
I spent a lot of time last week trying to get replay to encode, OCR, and index some video files that were captured and encoded for webcast.berkeley.edu. It was productive to go through the source code, looking for the reason I couldn’t get anything to index. After a couple of hours help from Tobias, we tracked down the problem: there is an undocumented dependency on the Perian toolkit on OS X. Now that perian is installed, mp4s, dv files, and the like are properly encoded, OCR’d, and indexed.
September 9, 2008
Webcast integration with REPLAY
The Opencast project’s first deliverable will be a version 0.1 integration of UCB’s Webcast system and ETH Zurich’s REPLAY (possibly also including Bjoern’s ‘channel syndication’ work). The primary barrier to the integration is the mismatch between REPLAY’s statically defined workflows (defined as ant scripts) and Webcast’s task based finite state machine (stored in the DB and loaded into memory at startup).
Tobias and I have thrown some ideas around for overcoming this mismatch, including:
- Colocate Webcast and REPLAY in the same JVM (or package the custom ant tasks and scripts in a jar, deployed to both systems), where the commands executed on state transitions call the ant tasks directly
- Call REPLAY’s internal SOAP interfaces
- Iterate through the “success” transitions in the state machine to generate a “directives” file for REPLAY to execute
- Generate a REPLAY directives file from the front-end, avoiding the state machine for everything but status reporting
- Colocate Webcast and REPLAY in the same JVM and call the REPLAY Java APIs from Webcast’s transition commands
- Integrate with Webcast’s ical based task reporting. This would involve:
- Adding discrete, atomic workflows to REPLAY
- Deploy an adapter to REPLAY’s manager component to consume Webcast’s ical tasks and execute the relevant workflow
- Update Webcast’s ical feed to include all relevant recording metadata so the adapter can re-create the bundle if necessary
I’d like to go with option #6, but I need to do some more digging in REPLAY to see if it’s possible to either reuse existing media bundles from past workflows or less desirably, whether we can create new bundles by reusing an existing media file.
June 25, 2007
Embedding an XMPP Server in Sakai
The first problem is finding a suitable project to start with. The openfire server is very nice, but it’s GPL. See my previous post for more whining on this issue.
The next problem is clustering the XMPP server itself. If we embed the server as a spring bean, we’ll have multiple instances running in our cluster, and these instances will need to coordinate among themselves. Some servers have this capability built in, but with such limited choices already due to licensing, the clustering feature may shrink the number to zero.
Also, the XMPP protocol requires that users log in when connecting to a server. This is fine for external applications wishing to communicate with a sakai-hosted XMPP server, but it’s problematic for internal use because we (rightly!) have no access to a user’s password at runtime. One solution to this could be to pass the session ID as the password, and have the XMPP server’s directory service implementation check to see whether a sakai session with that ID is currently active for that user. It’s a hack, but at least it’s a place to start.
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
zithromax
buy zithromax
sildenafil citrate
sildenafil
generic sildenafil citrate
viagra sildenafil
buy sildenafil citrate
sildenafil viagra
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
amoxil
buy amoxil
amoxil online
accutane
buy accutane
accutane online
cialis
Generic Cialis
Buy Cialis
Buy Cialis Online
cialis online
Order Cialis
Cheap Cialis
rimonabant
buy rimonabant
acomplia rimonabant
rimonabant acomplia
cipro
cipro online
buy cipro
synthroid
buy synthroid
synthroid online
diflucan
buy diflucan
diflucan online
vardenafil
levitra vardenafil
generic vardenafil
vardenafil hcl
buy vardenafil
vardenafil online
prozac
order prozac
prozac online
buy prozac
viagra
buy viagra
buy viagra online
viagra online
order viagra
cheap viagra
generic viagra
doxycycline
buy doxycycline
tadalafil
buy tadalafil
cialis tadalafil
buy tadalafil cialis
cheap tadalafil
tadalafil citrate
fosamax
order fosamax
fosamax online
lasix
buy lasix
voltaren
buy voltaren
propecia
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
amoxicillin
buy amoxicillin
amoxicillin online
zoloft
buy zoloft
generic zoloft
soft tab viagra
viagra soft tabs
viagra soft tab
zyrtec
buy zyrtec
zyrtec online
glucophage
buy glucophage
clomid
buy clomid
nolvadex
buy nolvadex
finasteride
propecia finasteride
buy finasteride
cialis soft tab
cialis soft tabs
cialis soft
lexapro
lexapro online
buy lexapro
flagyl
flagyl online
acomplia
buy acomplia
buy acomplia online
acomplia online
XMPP Servers
I’ve been looking at the available ECL license compatible XMPP server options out there, and the pickings are unfortunately slim. A quick perusal of this comparison shows that there are just two non-GPL XMPP servers that we can use: jabberd14 and openim.
Upon checking out openim, I noticed that the svn revision number was 10. There haven’t been any commits since May 7, so this project is either incredibly mature and in no need of bug fixing or new features, or the project is dead. My guess is the latter.
jabberd14, unfortunately, isn’t a java project. It’s implemented in C/C++, which means that it’ll be tricky to add to Sakai’s build and to the component manager.
Onward…
Update: openim pegs my CPU without having any work to do… lovely.
January 26, 2007
Transactions, Hibernate Sessions, and Spring initialization
Sakai’s CM service is very chatty. In particular, there are two places that make many small calls to CM. The first is Sakai’s CM-based GroupProvider. The second is a data loader to populate CM with a sample university SIS.
In both the GroupProvider and the data loader, I’ve been noticing some pretty poor performance. After reading a lot of spring source code and hacking in some extra logging, I realized why. If I call the CM service from outside of its transaction boundary, I get a new hibernate session for each CM call. When each method call uses a unique hibernate sessions, we get no L1 caching at all. And without a properly configured second level cache in Sakai, this means that there’s no object caching at all, and CM — due to the shape of the api — is just going to perform horribly.
Fortunately, there’s a way around performance bottleneck. If I make the CM calls from within one of the global transaction manager’s transactions, all of the hibernate activity will share the same session and will thus take advantage of hibernate’s L1 object caching.
Well, this worked pretty well for the GroupProvider. I noticed much less DB activity after I wrapped the GroupProvider impl in a transaction proxy. But what about the data loader? Well, the data loader does its thing during startup, with an init() called by spring after the bean has been instantiated and its dependencies set. That means that the data load occurs becore the current thread has a transaction bound to it. So even though the loader is wrapped in a transaction proxy, the init() isn’t transactional.
Of course, this didn’t deter me. I just need another spring bean to do the initialization, so it’s init() calls the dataloader’s init() through the transaction proxy! Brilliant, no?
No.
I believe the reason why this didn’t work is because the transaction proxies are set up with bean post processors, and my init() was run before the post-processing. Oh well, I guess having a slow sample data load (which is only for demo purposes) is better than having slow runtime performance.
July 14, 2006
Noisy Spring Bean Destruction
When spring’s DefaultListableBeanFactory (a superclass of a ClassPathApplicationContext, which is at the heart of Sakai’s ComponentManager implementation) fails to pre-instantiate all of it’s singleton beans, it immediately destroys all of them to ensure that they aren’t hanging around in a bad state. This makes sense, but in 1.2.8 the cleanup is implemented in a very quiet way. No logging, no stacktraces, nothing.
In order to debug why my component manager was failing to start up on my machine, I edited Spring’s DefaultListableBeanFactory so it would be a little noisier about *why* it was immediately destroying all of its singletons. If you find yourself in the uncomfortable position of debugging a component manager that is quietly failing, this will help you out.
The modified java file is available, as is the modified jar for those with better things to do than modify and build third-party jars.
Jar Hell with Maven? It can happen…
For the Fall 2006 bSpace deployment, we’re running a modified Sakai 2.1.2 along with an unreleased, bleeding-edge, post 2.2.0 version of the gradebook that’s been backported to work in 2.1.2. There were a lot of small changes to make to get this version of the gradebook to work in 2.1.2, including reverting to hibernate 2, updating the gradebook’s dependencies, and changing config files and import statements to point to the new (old) package names. But in the end, it was no big deal.
However, the name of the external gradebook service changed between Sakai 2.1.2 and 2.2. What was sakai-gradebook-service became sakai-gradebook-service-api. Notice the “api” appended to the end of the name.
Remember, other projects rely on the gradebook service to add assessments and scores into the gradebook.
So the name of the API changed… big deal. Well, it turns out that when a client of the gradebook service can’t locate its dependency locally in the current source tree, we get a build failure. However, that didn’t happen. What we did get was happy developer deployments to our local machines and happy deployments (mostly) to the integration box. But once it was time to deploy to QA, we got compilation errors.
That’s right, compilation errors. Not your typical NoClassDefFound classpath errors, but “symbol not found” errors.
After doing some digging, I realized that the sakai 2.1.2 jars had been published to the sakai maven repository. So even though there were gradebook service clients that couldn’t find the “sakai-gradebook-service” project locally, those clients could find the dependency out on the web. If the client code used a method that didn’t exist in the old jar, there would be a compilation failure. And this is what we saw on happen on QA.
So, I did two things to fix this. First, I updated the gradebook service clients in bspace to use the new API name so their build dependencies are satisfied locally. Second, I changed our jar version numbers to match our official bspace version, ‘bSpace-2.1.2_1_RC1′. This way, none of the bspace code will try to compile against published jars. They will always use the local code.
The moral of the story? If you’re making modifications to services, always use a custom version number for your jars.
June 19, 2006
Jforum deadlock problem solved?
When cleaning out the needless jforum logic that determined how to handle non-transactional DB connections (sakai should always be transactional), I inadvertantly removed the commit() call. This should have been a pretty easy thing to debug… if the DB connection is never committed, nothing should ever be saved to the database.
Oh, how naive! In sakai, we have a database connection pool. When jforum finished it’s request/response thread, it was returning its connection to the pool like any well behaved application should. The problem was that other application services were grabbing that same dirty connection, which was never committed and never rolled back. When that other service called commit() or rollBack(), the sql issued from jforum would suffer the same fate.
Note to self: just because spring takes care of all of your DB connection tasks for you, don’t assume that you’re done with DB connections for the rest of your life.