cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Hugi Thordarson <h...@karlmenn.is>
Subject Re: Reconnecting automatically after DB downtime
Date Wed, 09 Mar 2016 08:52:40 GMT
Nice, works like a charm :).

On a side note, websites that I’ve switched to HikariCP have been up since the switch, so
it does seem to have been a problem with Cayenne’s connection pool.

Also, the websites I’ve switched over feel like they’ve had a caffeine enema or something
of the ilk. They feel vastly faster in many cases. But that may also have something to do
with configuration (HikariCP has great pages about DB specific configuration for the most
common DBs).

https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration

Cheers,
- hugi



> On 8. mar. 2016, at 14:37, Andrus Adamchik <andrus@objectstyle.org> wrote:
> 
> Also pretty easy - define a custom DataSourceFactory:
> 
> builder.addModule(b -> b.bind(DataSourceFactory.class).to(MyImpl.class));
> 
> Andrus
> 
>> On Mar 8, 2016, at 3:20 AM, Hugi Thordarson <hugi@karlmenn.is> wrote:
>> 
>> Not quite done :).
>> 
>> I have a project that uses multiple Cayenne models connected to multiple databases.
The connection information is currently stored in the models and I’m constructing the ServerRuntime
like this:
>> 
>> ServerRuntimeBuilder b = new ServerRuntimeBuilder( "Netbokhald" );
>> b.addConfig( "cayenne-core/cayenne-project.xml" );
>> b.addConfig( "cayenne-reporting/cayenne-project.xml" );
>> 
>> How would I go about programmatically configuring separate DataSources for each model?
>> 
>> Cheers,
>> - hugi
>> 
>> 
>> 
>>> On 7. mar. 2016, at 21:03, Hugi Thordarson <hugi@karlmenn.is> wrote:
>>> 
>>> Well, that was easy! Up and running in production.
>>> 
>>> HikariConfig config = new HikariConfig();
>>> config.setJdbcUrl( "jdbc:mysql://server:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&connectTimeout=0"
);
>>> config.setUsername( “myUsername" );
>>> config.setPassword( “myPassword" );
>>> 
>>> HikariDataSource dataSource = new HikariDataSource( config );
>>> serverRuntimeBuilder = serverRuntimeBuilder.dataSource( dataSource );
>>> 
>>> Thanks,
>>> - hugi
>>> 
>>> 
>>>> On 7. mar. 2016, at 20:51, Andrus Adamchik <andrus@objectstyle.org>
wrote:
>>>> 
>>>> Yep. Cayenne built-in pool is intentionally basic with a minimal number of
features (Here we may be dealing with a bug though, and I'd like to fix it, but that's a separate
issue). So yeah, using a third party DS may be a good idea. Here is an example how you can
set it up:
>>>> 
>>>> DataSource ds = // instantiate it via API specific to you DS provider
>>>> 
>>>> ServerRuntime runtime = ServerRuntimeBuilder.builder().dataSource(ds).build();
>>>> // of course add any other things you need to add to the builder to get a
working Cayenne stack.
>>>> 
>>>> Andrus
>>>> 
>>>> 
>>>>> On Mar 7, 2016, at 12:45 PM, Hugi Thordarson <hugi@karlmenn.is>
wrote:
>>>>> 
>>>>> Thanks John! I’m going to try my hand at HikariCP.
>>>>> 
>>>>> Are there any examples anywhere on how to configure Cayenne to use a
third party connection pool?
>>>>> 
>>>>> Cheers,
>>>>> - hugi
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>>> On 7. mar. 2016, at 20:39, John Huss <johnthuss@gmail.com>
wrote:
>>>>>> 
>>>>>> EOF can do JNDI, but that's not going to do anything to fix your
problem.
>>>>>> 
>>>>>> The connection pool in cayenne had some changes somewhat recently
so it's
>>>>>> entirely possible there are bugs.
>>>>>> 
>>>>>> In practice it turns out many people don't use the connection pool
built-in
>>>>>> to Cayenne at all, and rather use a third-party connection pool,
of which
>>>>>> there are several.  The cayenne one is decent, but it is very limited
in
>>>>>> functionality and less robust due to having a smaller user base and
being a
>>>>>> non-core feature.
>>>>>> 
>>>>>> You can use another pool like:
>>>>>> hikari <https://github.com/brettwooldridge/HikariCP> - If I
was starting a
>>>>>> new project I'd use this
>>>>>> tomcat-jdbc <https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html>
-
>>>>>> This is what I currently use
>>>>>> commonds-dbcp <https://commons.apache.org/proper/commons-dbcp/>
>>>>>> c3po <http://www.mchange.com/projects/c3p0/>
>>>>>> 
>>>>>> The main reason I turned to a third-party connection pool was to
get
>>>>>> fair-scheduling which will provide connections to whoever has been
waiting
>>>>>> the longest, which helps avoid unnecessary errors caused by serving
>>>>>> requests out of order.
>>>>>> 
>>>>>> John
>>>>>> 
>>>>>> On Mon, Mar 7, 2016 at 2:31 PM Michael Gentry <mgentry@masslight.net>
wrote:
>>>>>> 
>>>>>>> Well, I'm not sure what you are using to run your web application,
but
>>>>>>> Tomcat, Jetty, JBoss, etc all have mechanisms to provide JNDI
lookups of DB
>>>>>>> connection pools.  You just tell Cayenne Modeler to use JNDI
lookup and
>>>>>>> give it the JNDI name, then configure the container to provide
the DB
>>>>>>> connection.
>>>>>>> 
>>>>>>> Is your WO application using EOF or Cayenne?  Been a while since
I used WO,
>>>>>>> but I'd be stunned if EOF cannot use a JNDI lookup as well.
>>>>>>> 
>>>>>>> mrg
>>>>>>> 
>>>>>>> 
>>>>>>> On Mon, Mar 7, 2016 at 3:07 PM, Hugi Thordarson <hugi@karlmenn.is>
wrote:
>>>>>>> 
>>>>>>>> Hi Michael,
>>>>>>>> does using JNDI change anything about the connection itself,
isn’t it
>>>>>>> just
>>>>>>>> a different method of looking up connection information?
>>>>>>>> 
>>>>>>>> But I probably can’t use it anyway since one of the apps
is a WebObjects
>>>>>>>> app and doesn’t provide a JNDI service (at least I’ve
never used it).
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> - hugi
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On 7. mar. 2016, at 19:13, Michael Gentry <mgentry@masslight.net>
>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> Hi Hugi,
>>>>>>>>> 
>>>>>>>>> Since this appears to be a web-based application, can
you switch to
>>>>>>> using
>>>>>>>>> JNDI?
>>>>>>>>> 
>>>>>>>>> mrg
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Mon, Mar 7, 2016 at 5:46 AM, Hugi Thordarson <hugi@karlmenn.is>
>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Hi all,
>>>>>>>>>> This is still happening, even after I added a validationQuery,
our app
>>>>>>>> is
>>>>>>>>>> dying quite frequently :(.  I’m not quite sure
how to debug this, is
>>>>>>>> there
>>>>>>>>>> any way for me to catch where connections are being
opened in the code
>>>>>>>> and
>>>>>>>>>> at what location they’re hanging?
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>> https://www.dropbox.com/s/8jkmh6513s6wwkn/Screenshot%202016-03-07%2010.21.53.png?dl=0
>>>>>>>>>> 
>>>>>>>>>> Cheer,
>>>>>>>>>> - hugi
>>>>>>>>>> 
>>>>>>>>>> // Hugi Thordarson
>>>>>>>>>> // http://www.loftfar.is/
>>>>>>>>>> // s. 895-6688
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> On 29. feb. 2016, at 11:25, Andrus Adamchik <andrus@objectstyle.org>
>>>>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On Feb 29, 2016, at 2:20 PM, Hugi Thordarson
<hugi@karlmenn.is>
>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> What does validationQuery do?
>>>>>>>>>>> 
>>>>>>>>>>> Periodically executes for each pooled connection,
and kills
>>>>>>> connections
>>>>>>>>>> that throw during validation. So it ensures that
all pooled
>>>>>>> connections
>>>>>>>> are
>>>>>>>>>> in a good state.
>>>>>>>>>>> 
>>>>>>>>>>> Andrus
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 


Mime
View raw message