Yes, that DI stuff is much nicer and it works fine. Thanks a lot.

And sorry for my ignorance - you pointed to the solution in your first reply. I just did not notice that it is the factory that you configure, not the data source.

Regards, Wernke

NB. Is it a known fact that you can't re-engineer an MS Access database with Cayenne builder? At least I did not manage it using the JdbcOdbc bridge. I converted it to MySQL and reengineered it from there. So no problem in the end.


On 26/05/2011 16:00, Andrus Adamchik wrote:
It is still possible with 3.1. The approach is the same - find all classes that 
use DataSource and replace it (the set of affected classes may be different). 
And you've discovered one way of doing that already.

Another more DI'ish way is to implement MyDataSourceFactory to return a 
"dynamic" DataSource that changes the returned connection under the covers 
based on a system property or a ThreadLocal value. So when you switch to processing a new 
DB, you start by setting that value, and your DataSource picks it up and returns 
connections pointing to the new DB. The advantage of that is that your code doesn't need 
to know Cayenne internals to work, it is all encapsulated in your own classes.

Andrus


On May 26, 2011, at 9:50 AM, Wernke zur Borg wrote:

Thanks, but I am not sure whether this is what I need.

I have hundreds of MS Access Database files (*.mdb), which I need to process in 
a single run of my program. Obviously I am using the JdbcOdbc bridge, which is 
working fine with Cayenne so far. My intention is to create a single 
ServerRuntime and then switch the data source dynamically for every file.

This used to be possible with 3.0 according to the FAQ entry - is it no longer 
possible with 3.1 ?

Thanks, Wernke


On 26/05/2011 15:25, Andrus Adamchik wrote:
Yeah, the Wiki page refers to Cayenne 3.0 and earlier. In 3.1 it is much easier 
and can be done via a DI container. And you don't have to remember all the 
classes that might use the DataSource. So you would create a custom module, 
bind a custom DataSourceFactory, and pass it to ServerRuntime constructor:

Module m = new Module() {
  public void configure(Binder binder) {
    binder.bind(DataSourceFactory.class).to(MyDataSourceFactory.class);
  }
};

ServerRuntime r = new ServerRuntime("cayenne-myconfig.xml", m);

On May 26, 2011, at 6:19 AM, Wernke zur Borg wrote:

Hi all,

I am referring to FAQ "Setting Database Connection" here: 
https://cwiki.apache.org/CAY/setting-database-connection.html

Firstly, in 3.1 the SharedConfiguration no longer exists, so we have to use the 
ServerRuntime instead:

   ServerRuntime runtime = ...;
   DataDomain domain = runtime.getDataDomain();
   DataNode node = domain.getNode("DB1");
   node.setDataSource(dataSource);

However, this setting does not have the desired effect. When the connection to 
the database is established, still the original definition from the config file 
is taken.

I have traced down this problem and found that the DataNode has a DbAdapter, 
which has its own DataSource object. This gets set in the 
ServerRuntime.getDataDomain() call above.

The only way I found around this is by explicitly creating a new adapter with 
my data source:

   node.setAdapter(new AutoAdapter(dataSource));

However, the AutoAdapter default constructor is deprecated, and I could not 
find an easy way to use the recommended method with a DbAdapterFactory.

Any ideas?

Thanks for any hint.

Wernke




--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MOIS Helpdesk at ESA/ESOC - B106
internal phone: "MOIS Helpdsk" or 62066
email: [email protected] , [email protected]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Wernke zur Borg
Software Engineer, Rhea System S.A.,
MOIS Support Team, European Space Operations Centre
Robert Bosch Str 5, 64293 Darmstadt, Germany
Tel: +49-6151-90-2344 Fax: +49-6151-90-2908


Reply via email to