Greetings,
I have an interesting issue I just ran into and it took a little while to debug
and figure out exactly what is happening.
I have a project that uses an embedded Derby database. My project folder
organization is a typical for an open source project:
/projectname
/bin
start.sh // starts the application
/data
/projectdb // this is the derby database.
My projectdb database also has a specific username, password, and
permissions/roles on that user.
When I start the application, the "start.sh" script sets the
-Dderby.system.home to the "/data" directory and my JDBC connection URL figures
out the fully qualified location of the "/projectdb" directory so Derby can
easily access it. This all works perfectly fine.
Then I wanted to run a test where I moved the /projectdb directory to a
different location. I though I would be able to do this with no problems. But
I was wrong :( When I do this I get the following authentication exception
Caused by: java.sql.SQLNonTransientConnectionException: Connection
authentication failure occurred. Reason: Invalid authentication..
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown
Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown
Source)
at
org.apache.derby.impl.jdbc.EmbedConnection.checkUserCredentials(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(Unknown
Source)
at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at
org.ferris.resiste.console.sql.SqlConnectionProducer.postConstruct(SqlConnectionProducer.java:31)
... 67 more
Caused by: ERROR 08004: Connection authentication failure occurred. Reason:
Invalid authentication..
at org.apache.derby.iapi.error.StandardException.newException(Unknown
Source)
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(Unknown
Source)
... 84 more
Which I thought was kind of odd. What I eventually discovered is the
-Dderby.system.home value and the location of the database must be in sync. If
they are not, I get the authentication exception. If do not set the
-Dderby.system.home value, I get this authentication exception.
Originally, I remember setting the -Dderby.system.home value because I wanted
the derby.log files created in that directory. I didn't expect this value would
also be critical for connecting to the database with a username/password. I
haven't tried it unauthenticated, but it seems to me I should be able to move
the location of the database around and as long as I'm connecting to the
database, authentication should work OK regardless of -Dderby.system.home and
the location of the database being in sync. This make sense?
Thanks!
Mike