This is an advanced topic, but it's worth bringing up here...

Typically, you want to include external data sources in the default delegator - instead of in a separate delegator.

If you look at the OOTB entityengine.xml file, there are three separate delegators defined. They all contain the same data sources, but the difference is in the delegator settings. So, there is one example of WHY you would want a separate delegator.

The other reason (theoretically) WHY you would have multiple delegators is when you have multiple data sources that contain table names that clash (more then one data source contains a table with the same name). You can use a separate reader and delegator to accommodate that, but from my perspective, it would be easier to use the default delegator and use a different entity name - and then utilize the table-name attribute to specify the clashing table name.

Example:

1. OFBiz Derby data source contains a table named PARTY, mapped to entity name Party.

2. External data source contains a table named PARTY.

3a. Create a separate delegator to map external PARTY table to entity Party.

3b. Use default delegator to map the external PARTY table to entity ExtParty (my preference). Both data sources have a table called PARTY, but one is referenced as Party, and the other is referenced as ExtParty - using the same delegator.

From my perspective, the multiple delegator readers are unnecessary because you have very fine-grained control over how tables are mapped to entities.


Adrian Crum
Sandglass Software
www.sandglass-software.com

On 12/17/2014 11:20 AM, i...@agentur-m3.de wrote:
Thank you Youssef!

now I understood that the delegator name ="default"
together with the group statements
should cause ofbiz to read of the records
of the external database (what is exactly
what I want to achieve).

With the new datasource definition now there are still (and also some
new) error messages concerning the database driver and about the
connection to the external database:

        at java.lang.Thread.run(Thread.java:745) [?:1.7.0_65]
20141217120652329 |OFBiz-config-0       |DatabaseUtil        |E| Unable
to establish a connection with the database for helperName [platfo]...
Error was: org.ofbiz.entity.GenericEntityException:
com.mysql.jdbc.Driver (com.mysql.jdbc.Driver)
20141217120652329 |OFBiz-config-0       |DatabaseUtil        |E| Unable
to establish a connection with the database, no additional information
available.
20141217120652329 |OFBiz-config-0       |DatabaseUtil        |E| Could
not get table name information from the database, aborting.
20141217120652329 |OFBiz-config-2       |BCPConnectionFactory|E| null
java.lang.ClassNotFoundException: Cached loader got a known bad class
name: com.mysql.jdbc.Driver
        at
org.ofbiz.base.util.CachedClassLoader.loadClass(CachedClassLoader.java:182)
~[ofbiz-base.jar:?]
        at
org.ofbiz.base.util.CachedClassLoader.loadClass(CachedClassLoader.java:162)
~[ofbiz-base.jar:?]
        at java.lang.Class.forName0(Native Method) ~[?:1.7.0_65]
        at java.lang.Class.forName(Class.java:274) ~[?:1.7.0_65]
        at
org.ofbiz.entity.connection.DBCPConnectionFactory.getConnection(DBCPConnectionFactory.java:87)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.jdbc.ConnectionFactory.getManagedConnection(ConnectionFactory.java:121)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.geronimo.GeronimoTransactionFactory.getConnection(GeronimoTransactionFactory.java:83)
[ofbiz-geronimo.jar:?]
        at
org.ofbiz.entity.transaction.TransactionFactory.getConnection(TransactionFactory.java:82)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:97)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.jdbc.DatabaseUtil.getConnection(DatabaseUtil.java:135)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.jdbc.DatabaseUtil.getConnectionLogged(DatabaseUtil.java:155)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.jdbc.DatabaseUtil.getTableNames(DatabaseUtil.java:977)
[ofbiz-entity-test.jar:?]
        at org.ofbiz.entity.jdbc.DatabaseUtil.checkDb(DatabaseUtil.java:189)
[ofbiz-entity-test.jar:?]
        at org.ofbiz.entity.jdbc.DatabaseUtil.checkDb(DatabaseUtil.java:178)
[ofbiz-entity-test.jar:?]
        at org.ofbiz.entity.datasource.GenericDAO.checkDb(GenericDAO.java:1234)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.datasource.GenericHelperDAO.checkDataSource(GenericHelperDAO.java:200)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.GenericDelegator.initializeOneGenericHelper(GenericDelegator.java:286)
[ofbiz-entity-test.jar:?]
        at
org.ofbiz.entity.GenericDelegator.access$000(GenericDelegator.java:87)
[ofbiz-entity-test.jar:?]
        at org.ofbiz.entity.GenericDelegator$1.call(GenericDelegator.java:297)
[ofbiz-entity-test.jar:?]
        at org.ofbiz.entity.GenericDelegator$1.call(GenericDelegator.java:295)
[ofbiz-entity-test.jar:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_65]
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
[?:1.7.0_65]
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
[?:1.7.0_65]
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
[?:1.7.0_65]
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[?:1.7.0_65]
        at java.lang.Thread.run(Thread.java:745) [?:1.7.0_65]
eadPoolExecutor.java:615) [?:1.7.0_65]
        at java.lang.Thread.run(Thread.java:745) [?:1.7.0_65]

--------------------------------------------------------------------------------

My changeddatasource definition:        
<datasource name="platfo"
                            
helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
                            field-type-name="mysql"
                            check-on-start="true"
                            add-missing-on-start="true"
                            check-pks-on-start="false"
                            use-foreign-keys="true"
                            join-style="ansi-no-parenthesis"
                            alias-view-columns="false"
                            drop-fk-use-foreign-key-keyword="true"
                            table-type="InnoDB"
                            character-set="latin1"
                            collate="latin1_general_cs">
                        <read-data reader-name="seed"/>
                        <read-data reader-name="seed-initial"/>
                        <read-data reader-name="demo"/>
                        <read-data reader-name="ext"/>
                        <read-data reader-name="main"/>
                        <inline-jdbc
                                jdbc-driver="com.mysql.jdbc.Driver"
                                jdbc-uri="jdbc:mysql://127.0.0.1:3306/wp_platfo"
                                jdbc-username="test"
                                jdbc-password="test"
                                isolation-level="ReadCommitted"
                                pool-minsize="2"
                                pool-maxsize="250"
                                time-between-eviction-runs-millis="600000" />   
   
                </datasource>             


and delegator:


                <delegator name="default" entity-model-reader="main"
                  entity-group-reader="main" entity-eca-reader="main"
                  distributed-cache-clear-enabled="false">
                  <group-map group-name="org.ofbiz" datasource-name="platfo"/>
                  <group-map group-name="org.ofbiz.olap" 
datasource-name="platfo"/>
                  <group-map group-name="org.ofbiz.tenant" 
datasource-name="platfo"/>
                </delegator>



Thanks again!



Am 12.12.2014 um 17:46 schrieb Youssef Khaye:
I will try to answer, even if i don't understand your use case at 100%

Hi for your second question the answer is no.

For your first question you should show us your entityengine.xml
There is two different cases where  you can use a second database.


Case 1 use a diffrent delegator (from your first post, i think that you
fill in this case), to get record you should instanciate

a  delegator using the name you declared in entityegine.xml
<delegator name="default" entity-model-reader="main"
entity-group-reader="main" entity-eca-reader="main"
distributed-cache-clear-enabled="false">
         <group-map group-name="org.ofbiz" datasource-name="localpostgres"/>
         <group-map group-name="org.ofbiz.olap"
datasource-name="localpostgres"/>
         <group-map group-name="org.ofbiz.tenant"
datasource-name="localpostgres"/>
</delegator>

<delegator name="mysqlDb" entity-model-reader="main"
entity-group-reader="main" entity-eca-reader="main"
distributed-cache-clear-enabled="false">
         <group-map group-name="com.custom datasource-name="sqlDataSource"/>
</delegator>

then in your service
delegator = delagtor.geInstance("mysqlDb")
then use the entity API to get record from your DB.


Case 2
In the same delegator you may assign a diffrent dataSource, that point
to the external DB, to a given package.

<delegator name="default" entity-model-reader="main"
entity-group-reader="main" entity-eca-reader="main"
distributed-cache-clear-enabled="false">
         <group-map group-name="org.ofbiz" datasource-name="localpostgres"/>
         <group-map group-name="com.custom datasource-name="sqlDataSource"/>
         <group-map group-name="org.ofbiz.olap"
datasource-name="localpostgres"/>
         <group-map group-name="org.ofbiz.tenant"
datasource-name="localpostgres"/>
</delegator>
In this case the defeault delegator you get in a service can fetch
record from any entity in the com.custom package.

Personnaly, I use the first one if I need the external database in
limited area of my OFBiz.

The second one is suitable if you need to access your external db in
many areas of your OFBiz


Le 12/12/2014 09:03, i...@agentur-m3.de a écrit :
Hi All!

after setting up the connection with an external database
without errors I have two more questions, on which I
could not find some specific information:

(1) after setting up an entity, a delegator and
I datasource, which seem to work together now,
how (or where?) is the exchange of RECORDS with the
external database? ofbiz does not seem to
automatically detect and show the records from the
mysql-database.
Maybe my entity definitions are still wrong,
but then without error messages.
However: no records are imported or displayed
in the view. So: how can I get them from the mysql-database?

Also unexpected to me: when I create new records in ofbiz,
they are displayed in ofbiz after creation (as one would
expect for any regular entity) but they are not transferred to
to the external mysql-database (which I guess could be
the purpose of a entity with associated externally
referenced datasource).

So it seems that ofbiz did recognize the structure of
the external mysql-database, but then ignores to
exchange the data between ofbiz and the database.

So how does ofbiz exchange records between
ofbiz and the external database (in a synchronized way)?

Is there further setup or custom implmentation necessary?

(2) the setup of a datasource is placed in entityengine.xml
in the framework/entity/config folder.
Is there a way to extend it with entries
defined in hot-deploy/.../entitydef/config/entityengine.xml ?

I tried to setup another entityengine.xml there,
but this approach seemed to be ignored by ofbiz.


Thank you!












Reply via email to