Hello

Interesting case. I did some work in pax-jdbc and was especially happy with
how PostgreSQL driver natively registers
org.osgi.service.jdbc.DataSourceFactory OSGi service. But tbh, even if I
did lot of pooling/non-pooling, XA/non-XA tests (under or without several
TX managers), I never tried (shame!) restarting postgresql driver bundle!.

With this etc/org.ops4j.datasource-postgres.cfg configuration:

osgi.jdbc.driver.class=org.postgresql.Driver
dataSourceName=postgres
dataSourceType=DataSource
jdbc.url=jdbc:postgresql://localhost:5432/reportdb
jdbc.user=xxx
jdbc.password=xxx

pool=dbcp2
# dbcp2 specific configuration of
org.apache.commons.pool2.impl.GenericObjectPoolConfig
pool.minIdle = 10
pool.maxTotal = 100
pool.blockWhenExhausted = true
pool.maxWaitMillis = 2000
pool.testOnBorrow = true
pool.testWhileIdle = false
pool.timeBetweenEvictionRunsMillis = 120000
pool.evictionPolicyClassName =
org.apache.commons.pool2.impl.DefaultEvictionPolicy

# dbcp2 specific configuration of
org.apache.commons.dbcp2.PoolableConnectionFactory
factory.maxConnLifetimeMillis = 30000
factory.validationQuery  = select schema_name from
information_schema.schemata
factory.validationQueryTimeout = 2

I also had this problem:

java.sql.SQLException: No suitable driver found for
jdbc:postgresql://localhost:5432/reportdb?loglevel[…]
at java.sql.DriverManager.getConnection(DriverManager.java:689) ~[?:?]
at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:?]
at
org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:86)
~[?:?]
at
org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:71)
~[?:?]
at
org.apache.commons.dbcp2.DataSourceConnectionFactory.createConnection(DataSourceConnectionFactory.java:44)
~[?:?]
at
org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:256)
~[?:?]
at
org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889)
~[?:?]
at
org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:433)
~[?:?]
at
org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
~[?:?]
at
org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
~[?:?]
at
org.apache.karaf.jdbc.internal.JdbcConnector.connect(JdbcConnector.java:49)
~[?:?]
at
org.apache.karaf.jdbc.internal.JdbcConnector.createStatement(JdbcConnector.java:61)
~[?:?]
at
org.apache.karaf.jdbc.internal.JdbcServiceImpl.query(JdbcServiceImpl.java:139)
~[?:?]
at org.apache.karaf.jdbc.command.QueryCommand.execute(QueryCommand.java:50)
~[?:?]
...

because, underneath there's always java.sql.DriverManager.getConnection()
call. And postgresql driver unregisters the driver when bundle stops, but
never registers it again when it starts (because the registration was in
static{} block, not in BundleActivator.start().

simply refreshing postgresql driver bundle after restarting did the trick
(new classloader → static{} block invoked again).

I'll switch to https://github.com/pgjdbc/pgjdbc/issues/1476 to continue the
thread.

regards
Grzegorz Grzybek

czw., 2 maj 2019 o 07:15 'Christoph Läubrich' via OPS4J <
ops4j@googlegroups.com> napisał(a):

> Correctly, the PGDataSourceFactory should simply instatiate the required
> class directly, no need for using the DriverManager at all!
> See [1] line 131 or [2] line 40, 47, 54 for example.
>
> The problem with DataSourceFactory is that it does not support dynmics
> or different class-loader spaces very well.
>
> [1]
>
> https://github.com/MariaDB/mariadb-connector-j/blob/1d831664f7d871ccd871fb9b2137ce3cd3421c4d/src/main/java/org/mariadb/jdbc/internal/osgi/MariaDbDataSourceFactory.java
>
> [2]
>
> https://github.com/Microsoft/mssql-jdbc/blob/dev/src/main/java/com/microsoft/sqlserver/jdbc/osgi/SQLServerDataSourceFactory.java
>
> Am 01.05.19 um 16:49 schrieb Steinar Bang:
> >>>>>> 'Christoph Läubrich' via OPS4J <ops4j-/
> jypxa39uh5tlh3mboc...@public.gmane.org>:
> >
> >> DriverManger.register/unregister can't work reliable in OSGi
> >> (especially with static insitilizer), thus always the
> >> DataSourceFactory should be used instead!
> >
> > PGDataSourceFactory is currently implemented using the regular PG JDBC
> > driver, ie. the Driver class, which in turn uses the DriverManager in
> > rt.jar.
> >
> > So the fix should be to change the implementation of PGDataSourceFactory
> > to not use the Driver class via DriverManager?  Maybe
> > PGDataSourceFactory should create and own a Driver instance?
> >
>
> --
> --
> ------------------
> OPS4J - http://www.ops4j.org - ops4j@googlegroups.com
>
> ---
> You received this message because you are subscribed to the Google Groups
> "OPS4J" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to ops4j+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
------------------
OPS4J - http://www.ops4j.org - ops4j@googlegroups.com

--- 
You received this message because you are subscribed to the Google Groups 
"OPS4J" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ops4j+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ops4j/CAAdXmhrVUkLC-BR%3DjC1auzLucREwNhBcp8z_TQ0TGeShZ5wcSQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to