0

USERS、ROLES、USERS_ROLES などのテーブルを含むダービー データベースが埋め込まれています。私の要件は、Tomcat 認証に使用することです。さらに、ユーザー、ロールなどをより簡単な方法で管理するために、Spring Web アプリケーションを作成しました。

以前、私は自分の applicationContext でこのデータソースを定義しました:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
    p:url="jdbc:derby:C:\tools\derbydb"
    p:connectionProperties=""
    p:username="APP"
    p:password="" />

このアプローチを JNDI に変更し、webapp/WEB-INF/context.xml で db リソースを定義しました。

<Context>
    <Resource name="jdbc/adminDB" auth="Container" type="javax.sql.DataSource"
            maxActive="20" maxIdle="10" username="APP" password=""
            driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
            url="jdbc:derby:C:\tools\derbydb"/>
</Context>

そして私のapplicationContext.xmlで:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/adminDB"/>
</bean>

日食では問題なく動作します。値の読み取り、編集、ログインなどができます。

私の問題は、Tomcat 6でこれを許可することに関連しています。stackoverflowの質問を含むいくつかのページを読みましたが、特定の問題が見つかりません。一部のデータにアクセスするために、Tomcat セキュリティを使用する別のアプリをデプロイしました。第三者が開発したアプリです。古い構成で正常に動作します (server.xml):

<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.apache.derby.jdbc.EmbeddedDriver" connectionURL="jdbc:derby:C:\tools\derbydb" connectionName="APP" connectionPassword="" userTable="USERS" userNameCol="USERNAME" userCredCol="PASSWORD" userRoleTable="V_USERS_ROLES" roleNameCol="ROLENAME"/>

Tomcatを使用して、データベースで定義されたユーザーでログインできました。しかし今、私はこのようなものを定義しました (server.xml):

<Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/adminDB" userTable="USERS" userNameCol="USERNAME" userCredCol="PASSWORD" userRoleTable="V_USERS_ROLES" roleNameCol="ROLENAME"/>

および server.xml (GlobalNamingResources) 内

<Resource name="jdbc/adminDB" auth="Container" type="javax.sql.DataSource"
        maxActive="20" maxIdle="10" username="APP" password=""
        driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
        url="jdbc:derby:C:\tools\derbydb"/>

ログインしようとすると、次のエラーが表示されます。

SEVERE: Excepci¾n realizando autenticaci¾n
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Failed to s
tart database 'C:\tools\derbydb' with class loader org.apache.catalina.loader.StandardClassLoader@23
49e5ef, see the next exception for details.)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSour
ce.java:1549)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at org.apache.catalina.realm.DataSourceRealm.open(DataSourceRealm.java:416)
        at org.apache.catalina.realm.DataSourceRealm.authenticate(DataSourceRealm.java:296)
        at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java
:181)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.ja
va:606)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:722)
Caused by: java.sql.SQLException: Failed to start database 'C:\tools\derbydb' with class loader org.
apache.catalina.loader.StandardClassLoader@2349e5ef, see the next exception for details.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedConnection40.<init>(Unknown Source)
        at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(Unknown Source)
        at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
        at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
        at org.apache.tomcat.dbcp.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFact
ory.java:38)
        at org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactor
y.java:582)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.jav
a:1556)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSour
ce.java:1545)
        ... 14 more
Caused by: java.sql.SQLException: Failed to start database 'C:\tools\derbydb' with class loader org.
apache.catalina.loader.StandardClassLoader@2349e5ef, see the next exception for details.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown S
ource)
        ... 28 more
Caused by: java.sql.SQLException: Another instance of Derby may have already booted the database C:\
tools\derbydb.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown S
ource)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
        ... 25 more
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database C:\tools\derb
ydb.
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Sour
ce)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.getJBMSLockOnDB(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.startModule(Unknown Source)
        at org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Unknown Source)
        at org.apache.derby.impl.store.raw.RawStore.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.startModule(Unknown Source)
        at org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Unknown Source)
        at org.apache.derby.impl.store.access.RAMAccessManager.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.startModule(Unknown Source)
        at org.apache.derby.iapi.services.monitor.Monitor.bootServiceModule(Unknown Source)
        at org.apache.derby.impl.db.BasicDatabase.bootStore(Unknown Source)
        at org.apache.derby.impl.db.BasicDatabase.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.boot(Unknown Source)
        at org.apache.derby.impl.services.monitor.TopService.bootModule(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.bootService(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.startProviderService(Unknown Source)
        at org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(Unknown So
urce)
        at org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(Unknown Source)

        at org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(Unknown Source)
        ... 25 more

別の JVM のアプリが derby データベースをロックしているようです。しかし、Tomcat自体を除いて、dbにアクセスするものは何もありません。そして、現時点では管理Webアプリケーションを展開していません。Tomcat ログインを使用するアプリのみをデプロイしました。何が起こっているか知っている人はいますか?

ところで...管理Webアプリケーションからデータベースにアクセスするには、この解決策は正しいですか? または、context.xml でリソースを定義する必要がありますか?

役立つ回答は投票されます

ありがとうございました

4

1 に答える 1

0

単一の Tomcat アプリケーション サーバー内の個別のアプリケーションはそれぞれ、Derby の個別のインスタンスと見なされます。

したがって、Derby の Client-Server 構成を使用して Derby Network Server を構成しない限り、同じ Tomcat アプリ サーバー内の 2 つの異なるアプリケーションが Derby の同じコピーにアクセスすることはできません。

于 2013-07-05T17:43:02.630 に答える