You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Craig Russell <ap...@gmail.com> on 2017/05/17 00:51:33 UTC

Passing jdbc connection properties to underlying jdbc connection

Hi,

I've got an implementation of a plugin Broker that uses an underlying jdbc connection via the dbcp implementation.

I need to pass a property to the DriverManager.getConnection(String url, Properties props) method.

I've looked for how a special property can be configured and I'm stuck. I'm passing the URL via a variable on the command line. 
-Dopenjpa.ConnectionURL="jdbc:mysql://localhost:13021/test" Maybe there is a way to pass extra connection properties either via command line or via the broker?

Any ideas?

Thanks,

Craig

<openjpa-2.2.2-r422266:1468616 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration: <openjpa-2.2.2-r422266:1468616 fatal user error> org.apache.openjpa.util.UserException: A connection could not be obtained for driver class "com.mysql.jdbc.Driver" and URL "jdbc:mysql://localhost:13021/test".  You may have specified an invalid URL.
	at org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:255)
	at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:241)
	at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:733)
	at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(ConfigurationImpl.java:306)
	at org.apache.openjpa.conf.OpenJPAConfigurationImpl.instantiateAll(OpenJPAConfigurationImpl.java:1670)
	at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:652)
	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203)
	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:42)
	at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(SingleEMFTestCase.java:55)
	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:35)
	at junit.framework.TestCase.run(TestCase.java:52)
	at com.mysql.clusterj.jpatest.PersistenceTestCase.run(PersistenceTestCase.java:104)
	at junit.framework.TestSuite.run(TestSuite.java:125)
	at junit.textui.TestRunner.run(TestRunner.java:46)
	at testsuite.clusterj.AllTests.main(AllTests.java:150)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 199 milliseconds ago.)
	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
	at org.apache.openjpa.jdbc.schema.DBCPDriverDataSource.getDBCPConnection(DBCPDriverDataSource.java:74)
	at org.apache.openjpa.jdbc.schema.AutoDriverDataSource.getConnection(AutoDriverDataSource.java:42)
	at org.apache.openjpa.jdbc.schema.SimpleDriverDataSource.getConnection(SimpleDriverDataSource.java:76)
	at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:118)
	at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:93)
	at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:233)
	... 20 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 199 milliseconds ago.
	at sun.reflect.GeneratedConstructorAccessor46.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
	at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:175)
	at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4901)
	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1659)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2194)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2225)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.GeneratedConstructorAccessor38.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
	... 28 more
Caused by: javax.net.ssl.SSLException: Server selected improper ciphersuite SSL_RSA_WITH_RC4_128_MD5
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1916)
	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279)
	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:269)
	at sun.security.ssl.ClientHandshaker.serverHello(ClientHandshaker.java:531)
	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:203)
	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913)
	at sun.security.ssl.Handshaker.process_record(Handshaker.java:849)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1035)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
	at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:160)
	... 46 more

	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:218)
	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:42)
	at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(SingleEMFTestCase.java:55)
	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:35)
	at junit.framework.TestCase.run(TestCase.java:52)
	at com.mysql.clusterj.jpatest.PersistenceTestCase.run(PersistenceTestCase.java:104)
	at junit.framework.TestSuite.run(TestSuite.java:125)
	at junit.textui.TestRunner.run(TestRunner.java:46)
	at testsuite.clusterj.AllTests.main(AllTests.java:150)
Craig L Russell
clr@apache.org


Re: Passing jdbc connection properties to underlying jdbc connection

Posted by Albert Lee <al...@gmail.com>.
I ran into similar problem with passing SSL enablement properties to the
connection properties.

See https://issues.apache.org/jira/browse/OPENJPA-2516 for more details.

I submitted and committed a patch such that I can get around the problem
with SSL connection. This may be enhanced to get what you want.

Albert.

On Wed, May 17, 2017 at 7:40 PM, Craig Russell <ap...@gmail.com> wrote:

> Hi Strub,
>
> > On May 16, 2017, at 10:58 PM, Mark Struberg <st...@yahoo.de.INVALID>
> wrote:
> >
> > Hi Craig!
> >
> > Those are additional properties which are _not_ passed in to
> EntityManagerFactore.createEM(String, Map) ?
>
> What I'm trying to do is to pass extra properties to the underlying
> connection which is normally opaque to the user. The connection url, user,
> and password have official property names in the map. What I'm trying to do
> is to pass an additional property to the jdbc driver manager.
>
> I'm thinking that there must be a way to tell openjpa that a key should be
> stripped and the result passed to the jdbc driver manager as a property.
>
> For example, key: openjpa.ConnectionExtra.useSSL, value: false
>
> This should be passed to the jdbc driver manager as a property
> "useSSL":"false".
> >
> > From the stacktrace it looks like you run some unit test, right?
> > Do you do this via Maven or your IDE?
>
> I do this via Maven and there's another way to run the tests that is
> managed by explicit -Dopenjpa.ConnectionURL=jdbc:mysql://localhost:13021/test
> and that works fine. But I also want to know how to use e.g.
> -Dopenjpa.ConnectionExtra.useSSL=false
> >
> > The -D you set should imo work. We use the same within OpenJPA itself.
> > But it might happen that it doesn't get propagated to your java process?
>
> I just need to know the key prefix of the property or if there is some
> other way to pass connection properties.
> >
> > Can you probably check your System.properties in the debugger, just to
> see whether this properly gets propagated?
>
> The existing "known" properties work fine. I'm looking for an extra
> property that openjpa doesn't know anything about.
>
> Thanks,
>
> Craig
> >
> >
> > If you run it via Maven than you might probably tell the
> maven-surefire-plugin to set it.
> >
> > <plugin>
> >    <groupId>org.apache.maven.plugins</groupId>
> >    <artifactId>maven-surefire-plugin</artifactId>
> >    <version>${maven.surefire.version}</version>
> >    <configuration>
> >        <systemProperties>
> >          <property>
> >              <name>openjpa.ConnectionURL</name>
> >              <value>${connection.url}</value>
> >          </property>
> > ...
> >
> > LieGrue,
> > strub
> >
> >
> >> Am 17.05.2017 um 02:51 schrieb Craig Russell <ap...@gmail.com>:
> >>
> >> Hi,
> >>
> >> I've got an implementation of a plugin Broker that uses an underlying
> jdbc connection via the dbcp implementation.
> >>
> >> I need to pass a property to the DriverManager.getConnection(String
> url, Properties props) method.
> >>
> >> I've looked for how a special property can be configured and I'm stuck.
> I'm passing the URL via a variable on the command line.
> >> -Dopenjpa.ConnectionURL="jdbc:mysql://localhost:13021/test" Maybe
> there is a way to pass extra connection properties either via command line
> or via the broker?
> >>
> >> Any ideas?
> >>
> >> Thanks,
> >>
> >> Craig
> >>
> >> <openjpa-2.2.2-r422266:1468616 nonfatal general error>
> org.apache.openjpa.persistence.PersistenceException: There were errors
> initializing your configuration: <openjpa-2.2.2-r422266:1468616 fatal user
> error> org.apache.openjpa.util.UserException: A connection could not be
> obtained for driver class "com.mysql.jdbc.Driver" and URL
> "jdbc:mysql://localhost:13021/test".  You may have specified an invalid
> URL.
> >>      at org.apache.openjpa.jdbc.schema.DataSourceFactory.
> newConnectException(DataSourceFactory.java:255)
> >>      at org.apache.openjpa.jdbc.schema.DataSourceFactory.
> installDBDictionary(DataSourceFactory.java:241)
> >>      at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.
> getConnectionFactory(JDBCConfigurationImpl.java:733)
> >>      at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
> >>      at sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:43)
> >>      at java.lang.reflect.Method.invoke(Method.java:606)
> >>      at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(
> ConfigurationImpl.java:306)
> >>      at org.apache.openjpa.conf.OpenJPAConfigurationImpl.
> instantiateAll(OpenJPAConfigurationImpl.java:1670)
> >>      at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(
> AbstractBrokerFactory.java:652)
> >>      at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(
> AbstractBrokerFactory.java:203)
> >>      at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(
> DelegatingBrokerFactory.java:156)
> >>      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.
> createEntityManager(EntityManagerFactoryImpl.java:227)
> >>      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.
> createEntityManager(EntityManagerFactoryImpl.java:154)
> >>      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.
> createEntityManager(EntityManagerFactoryImpl.java:60)
> >>      at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(
> SingleEMTestCase.java:42)
> >>      at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(
> SingleEMFTestCase.java:55)
> >>      at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(
> SingleEMTestCase.java:35)
> >>      at junit.framework.TestCase.run(TestCase.java:52)
> >>      at com.mysql.clusterj.jpatest.PersistenceTestCase.run(
> PersistenceTestCase.java:104)
> >>      at junit.framework.TestSuite.run(TestSuite.java:125)
> >>      at junit.textui.TestRunner.run(TestRunner.java:46)
> >>      at testsuite.clusterj.AllTests.main(AllTests.java:150)
> >> Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create
> PoolableConnectionFactory (Communications link failure
> >>
> >> The last packet successfully received from the server was 206
> milliseconds ago.  The last packet sent successfully to the server was 199
> milliseconds ago.)
> >>      at org.apache.commons.dbcp.BasicDataSource.
> createPoolableConnectionFactory(BasicDataSource.java:1549)
> >>      at org.apache.commons.dbcp.BasicDataSource.createDataSource(
> BasicDataSource.java:1388)
> >>      at org.apache.commons.dbcp.BasicDataSource.getConnection(
> BasicDataSource.java:1044)
> >>      at org.apache.openjpa.jdbc.schema.DBCPDriverDataSource.
> getDBCPConnection(DBCPDriverDataSource.java:74)
> >>      at org.apache.openjpa.jdbc.schema.AutoDriverDataSource.
> getConnection(AutoDriverDataSource.java:42)
> >>      at org.apache.openjpa.jdbc.schema.SimpleDriverDataSource.
> getConnection(SimpleDriverDataSource.java:76)
> >>      at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(
> DelegatingDataSource.java:118)
> >>      at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(
> DecoratingDataSource.java:93)
> >>      at org.apache.openjpa.jdbc.schema.DataSourceFactory.
> installDBDictionary(DataSourceFactory.java:233)
> >>      ... 20 more
> >> Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
> Communications link failure
> >>
> >> The last packet successfully received from the server was 206
> milliseconds ago.  The last packet sent successfully to the server was 199
> milliseconds ago.
> >>      at sun.reflect.GeneratedConstructorAccessor46.newInstance(Unknown
> Source)
> >>      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(
> DelegatingConstructorAccessorImpl.java:45)
> >>      at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> >>      at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
> >>      at com.mysql.jdbc.SQLError.createCommunicationsException(
> SQLError.java:989)
> >>      at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(
> ExportControlled.java:175)
> >>      at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(
> MysqlIO.java:4901)
> >>      at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableA
> uthentication(MysqlIO.java:1659)
> >>      at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
> >>      at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.
> java:2194)
> >>      at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(
> ConnectionImpl.java:2225)
> >>      at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.
> java:2024)
> >>      at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
> >>      at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
> >>      at sun.reflect.GeneratedConstructorAccessor38.newInstance(Unknown
> Source)
> >>      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(
> DelegatingConstructorAccessorImpl.java:45)
> >>      at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> >>      at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
> >>      at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.
> java:389)
> >>      at com.mysql.jdbc.NonRegisteringDriver.connect(
> NonRegisteringDriver.java:330)
> >>      at org.apache.commons.dbcp.DriverConnectionFactory.
> createConnection(DriverConnectionFactory.java:38)
> >>      at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(
> PoolableConnectionFactory.java:582)
> >>      at org.apache.commons.dbcp.BasicDataSource.
> validateConnectionFactory(BasicDataSource.java:1556)
> >>      at org.apache.commons.dbcp.BasicDataSource.
> createPoolableConnectionFactory(BasicDataSource.java:1545)
> >>      ... 28 more
> >> Caused by: javax.net.ssl.SSLException: Server selected improper
> ciphersuite SSL_RSA_WITH_RC4_128_MD5
> >>      at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
> >>      at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1916)
> >>      at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279)
> >>      at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:269)
> >>      at sun.security.ssl.ClientHandshaker.serverHello(
> ClientHandshaker.java:531)
> >>      at sun.security.ssl.ClientHandshaker.processMessage(
> ClientHandshaker.java:203)
> >>      at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913)
> >>      at sun.security.ssl.Handshaker.process_record(Handshaker.java:849)
> >>      at sun.security.ssl.SSLSocketImpl.readRecord(
> SSLSocketImpl.java:1035)
> >>      at sun.security.ssl.SSLSocketImpl.performInitialHandshake(
> SSLSocketImpl.java:1344)
> >>      at sun.security.ssl.SSLSocketImpl.startHandshake(
> SSLSocketImpl.java:1371)
> >>      at sun.security.ssl.SSLSocketImpl.startHandshake(
> SSLSocketImpl.java:1355)
> >>      at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(
> ExportControlled.java:160)
> >>      ... 46 more
> >>
> >>      at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(
> AbstractBrokerFactory.java:218)
> >>      at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(
> DelegatingBrokerFactory.java:156)
> >>      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.
> createEntityManager(EntityManagerFactoryImpl.java:227)
> >>      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.
> createEntityManager(EntityManagerFactoryImpl.java:154)
> >>      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.
> createEntityManager(EntityManagerFactoryImpl.java:60)
> >>      at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(
> SingleEMTestCase.java:42)
> >>      at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(
> SingleEMFTestCase.java:55)
> >>      at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(
> SingleEMTestCase.java:35)
> >>      at junit.framework.TestCase.run(TestCase.java:52)
> >>      at com.mysql.clusterj.jpatest.PersistenceTestCase.run(
> PersistenceTestCase.java:104)
> >>      at junit.framework.TestSuite.run(TestSuite.java:125)
> >>      at junit.textui.TestRunner.run(TestRunner.java:46)
> >>      at testsuite.clusterj.AllTests.main(AllTests.java:150)
> >> Craig L Russell
> >> clr@apache.org
> >>
> >
>
> Craig L Russell
> Secretary, Apache Software Foundation
> clr@apache.org http://db.apache.org/jdo
>
>


-- 
Albert Lee.

Re: Passing jdbc connection properties to underlying jdbc connection

Posted by Craig Russell <ap...@gmail.com>.
Hi Strub,

> On May 16, 2017, at 10:58 PM, Mark Struberg <st...@yahoo.de.INVALID> wrote:
> 
> Hi Craig!
> 
> Those are additional properties which are _not_ passed in to EntityManagerFactore.createEM(String, Map) ?

What I'm trying to do is to pass extra properties to the underlying connection which is normally opaque to the user. The connection url, user, and password have official property names in the map. What I'm trying to do is to pass an additional property to the jdbc driver manager.

I'm thinking that there must be a way to tell openjpa that a key should be stripped and the result passed to the jdbc driver manager as a property.

For example, key: openjpa.ConnectionExtra.useSSL, value: false 

This should be passed to the jdbc driver manager as a property "useSSL":"false".
> 
> From the stacktrace it looks like you run some unit test, right?
> Do you do this via Maven or your IDE?

I do this via Maven and there's another way to run the tests that is managed by explicit -Dopenjpa.ConnectionURL=jdbc:mysql://localhost:13021/test and that works fine. But I also want to know how to use e.g. -Dopenjpa.ConnectionExtra.useSSL=false
> 
> The -D you set should imo work. We use the same within OpenJPA itself.
> But it might happen that it doesn't get propagated to your java process?

I just need to know the key prefix of the property or if there is some other way to pass connection properties.
> 
> Can you probably check your System.properties in the debugger, just to see whether this properly gets propagated?

The existing "known" properties work fine. I'm looking for an extra property that openjpa doesn't know anything about.

Thanks,

Craig
> 
> 
> If you run it via Maven than you might probably tell the maven-surefire-plugin to set it.
> 
> <plugin>
>    <groupId>org.apache.maven.plugins</groupId>
>    <artifactId>maven-surefire-plugin</artifactId>
>    <version>${maven.surefire.version}</version>
>    <configuration>
>        <systemProperties>
>          <property>
>              <name>openjpa.ConnectionURL</name>
>              <value>${connection.url}</value> 
>          </property>
> ...
> 
> LieGrue,
> strub
> 
> 
>> Am 17.05.2017 um 02:51 schrieb Craig Russell <ap...@gmail.com>:
>> 
>> Hi,
>> 
>> I've got an implementation of a plugin Broker that uses an underlying jdbc connection via the dbcp implementation.
>> 
>> I need to pass a property to the DriverManager.getConnection(String url, Properties props) method.
>> 
>> I've looked for how a special property can be configured and I'm stuck. I'm passing the URL via a variable on the command line. 
>> -Dopenjpa.ConnectionURL="jdbc:mysql://localhost:13021/test" Maybe there is a way to pass extra connection properties either via command line or via the broker?
>> 
>> Any ideas?
>> 
>> Thanks,
>> 
>> Craig
>> 
>> <openjpa-2.2.2-r422266:1468616 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration: <openjpa-2.2.2-r422266:1468616 fatal user error> org.apache.openjpa.util.UserException: A connection could not be obtained for driver class "com.mysql.jdbc.Driver" and URL "jdbc:mysql://localhost:13021/test".  You may have specified an invalid URL.
>> 	at org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:255)
>> 	at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:241)
>> 	at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:733)
>> 	at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
>> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>> 	at java.lang.reflect.Method.invoke(Method.java:606)
>> 	at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(ConfigurationImpl.java:306)
>> 	at org.apache.openjpa.conf.OpenJPAConfigurationImpl.instantiateAll(OpenJPAConfigurationImpl.java:1670)
>> 	at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:652)
>> 	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203)
>> 	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
>> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
>> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
>> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
>> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:42)
>> 	at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(SingleEMFTestCase.java:55)
>> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:35)
>> 	at junit.framework.TestCase.run(TestCase.java:52)
>> 	at com.mysql.clusterj.jpatest.PersistenceTestCase.run(PersistenceTestCase.java:104)
>> 	at junit.framework.TestSuite.run(TestSuite.java:125)
>> 	at junit.textui.TestRunner.run(TestRunner.java:46)
>> 	at testsuite.clusterj.AllTests.main(AllTests.java:150)
>> Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
>> 
>> The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 199 milliseconds ago.)
>> 	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
>> 	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
>> 	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
>> 	at org.apache.openjpa.jdbc.schema.DBCPDriverDataSource.getDBCPConnection(DBCPDriverDataSource.java:74)
>> 	at org.apache.openjpa.jdbc.schema.AutoDriverDataSource.getConnection(AutoDriverDataSource.java:42)
>> 	at org.apache.openjpa.jdbc.schema.SimpleDriverDataSource.getConnection(SimpleDriverDataSource.java:76)
>> 	at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:118)
>> 	at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:93)
>> 	at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:233)
>> 	... 20 more
>> Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
>> 
>> The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 199 milliseconds ago.
>> 	at sun.reflect.GeneratedConstructorAccessor46.newInstance(Unknown Source)
>> 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
>> 	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
>> 	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
>> 	at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:175)
>> 	at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4901)
>> 	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1659)
>> 	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
>> 	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2194)
>> 	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2225)
>> 	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024)
>> 	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
>> 	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
>> 	at sun.reflect.GeneratedConstructorAccessor38.newInstance(Unknown Source)
>> 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
>> 	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
>> 	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
>> 	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
>> 	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
>> 	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
>> 	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
>> 	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
>> 	... 28 more
>> Caused by: javax.net.ssl.SSLException: Server selected improper ciphersuite SSL_RSA_WITH_RC4_128_MD5
>> 	at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
>> 	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1916)
>> 	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279)
>> 	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:269)
>> 	at sun.security.ssl.ClientHandshaker.serverHello(ClientHandshaker.java:531)
>> 	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:203)
>> 	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913)
>> 	at sun.security.ssl.Handshaker.process_record(Handshaker.java:849)
>> 	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1035)
>> 	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344)
>> 	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
>> 	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
>> 	at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:160)
>> 	... 46 more
>> 
>> 	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:218)
>> 	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
>> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
>> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
>> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
>> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:42)
>> 	at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(SingleEMFTestCase.java:55)
>> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:35)
>> 	at junit.framework.TestCase.run(TestCase.java:52)
>> 	at com.mysql.clusterj.jpatest.PersistenceTestCase.run(PersistenceTestCase.java:104)
>> 	at junit.framework.TestSuite.run(TestSuite.java:125)
>> 	at junit.textui.TestRunner.run(TestRunner.java:46)
>> 	at testsuite.clusterj.AllTests.main(AllTests.java:150)
>> Craig L Russell
>> clr@apache.org
>> 
> 

Craig L Russell
Secretary, Apache Software Foundation
clr@apache.org http://db.apache.org/jdo


Re: Passing jdbc connection properties to underlying jdbc connection

Posted by Mark Struberg <st...@yahoo.de.INVALID>.
Hi Craig!

Those are additional properties which are _not_ passed in to EntityManagerFactore.createEM(String, Map) ?

From the stacktrace it looks like you run some unit test, right?
Do you do this via Maven or your IDE?

The -D you set should imo work. We use the same within OpenJPA itself.
But it might happen that it doesn't get propagated to your java process?

Can you probably check your System.properties in the debugger, just to see whether this properly gets propagated?


If you run it via Maven than you might probably tell the maven-surefire-plugin to set it.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven.surefire.version}</version>
    <configuration>
        <systemProperties>
          <property>
              <name>openjpa.ConnectionURL</name>
              <value>${connection.url}</value> 
          </property>
...

LieGrue,
strub


> Am 17.05.2017 um 02:51 schrieb Craig Russell <ap...@gmail.com>:
> 
> Hi,
> 
> I've got an implementation of a plugin Broker that uses an underlying jdbc connection via the dbcp implementation.
> 
> I need to pass a property to the DriverManager.getConnection(String url, Properties props) method.
> 
> I've looked for how a special property can be configured and I'm stuck. I'm passing the URL via a variable on the command line. 
> -Dopenjpa.ConnectionURL="jdbc:mysql://localhost:13021/test" Maybe there is a way to pass extra connection properties either via command line or via the broker?
> 
> Any ideas?
> 
> Thanks,
> 
> Craig
> 
> <openjpa-2.2.2-r422266:1468616 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration: <openjpa-2.2.2-r422266:1468616 fatal user error> org.apache.openjpa.util.UserException: A connection could not be obtained for driver class "com.mysql.jdbc.Driver" and URL "jdbc:mysql://localhost:13021/test".  You may have specified an invalid URL.
> 	at org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:255)
> 	at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:241)
> 	at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:733)
> 	at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:606)
> 	at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(ConfigurationImpl.java:306)
> 	at org.apache.openjpa.conf.OpenJPAConfigurationImpl.instantiateAll(OpenJPAConfigurationImpl.java:1670)
> 	at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:652)
> 	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203)
> 	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:42)
> 	at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(SingleEMFTestCase.java:55)
> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:35)
> 	at junit.framework.TestCase.run(TestCase.java:52)
> 	at com.mysql.clusterj.jpatest.PersistenceTestCase.run(PersistenceTestCase.java:104)
> 	at junit.framework.TestSuite.run(TestSuite.java:125)
> 	at junit.textui.TestRunner.run(TestRunner.java:46)
> 	at testsuite.clusterj.AllTests.main(AllTests.java:150)
> Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
> 
> The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 199 milliseconds ago.)
> 	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
> 	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
> 	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
> 	at org.apache.openjpa.jdbc.schema.DBCPDriverDataSource.getDBCPConnection(DBCPDriverDataSource.java:74)
> 	at org.apache.openjpa.jdbc.schema.AutoDriverDataSource.getConnection(AutoDriverDataSource.java:42)
> 	at org.apache.openjpa.jdbc.schema.SimpleDriverDataSource.getConnection(SimpleDriverDataSource.java:76)
> 	at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:118)
> 	at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:93)
> 	at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:233)
> 	... 20 more
> Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
> 
> The last packet successfully received from the server was 206 milliseconds ago.  The last packet sent successfully to the server was 199 milliseconds ago.
> 	at sun.reflect.GeneratedConstructorAccessor46.newInstance(Unknown Source)
> 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> 	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
> 	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
> 	at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:175)
> 	at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4901)
> 	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1659)
> 	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
> 	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2194)
> 	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2225)
> 	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024)
> 	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
> 	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
> 	at sun.reflect.GeneratedConstructorAccessor38.newInstance(Unknown Source)
> 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> 	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
> 	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
> 	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
> 	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
> 	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
> 	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
> 	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
> 	... 28 more
> Caused by: javax.net.ssl.SSLException: Server selected improper ciphersuite SSL_RSA_WITH_RC4_128_MD5
> 	at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
> 	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1916)
> 	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279)
> 	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:269)
> 	at sun.security.ssl.ClientHandshaker.serverHello(ClientHandshaker.java:531)
> 	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:203)
> 	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913)
> 	at sun.security.ssl.Handshaker.process_record(Handshaker.java:849)
> 	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1035)
> 	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344)
> 	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
> 	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
> 	at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:160)
> 	... 46 more
> 
> 	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:218)
> 	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:154)
> 	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60)
> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:42)
> 	at com.mysql.clusterj.jpatest.SingleEMFTestCase.setUp(SingleEMFTestCase.java:55)
> 	at com.mysql.clusterj.jpatest.SingleEMTestCase.setUp(SingleEMTestCase.java:35)
> 	at junit.framework.TestCase.run(TestCase.java:52)
> 	at com.mysql.clusterj.jpatest.PersistenceTestCase.run(PersistenceTestCase.java:104)
> 	at junit.framework.TestSuite.run(TestSuite.java:125)
> 	at junit.textui.TestRunner.run(TestRunner.java:46)
> 	at testsuite.clusterj.AllTests.main(AllTests.java:150)
> Craig L Russell
> clr@apache.org
>