0

Tomcat と Hibernate + c3p0 を使用する完全に機能する webapp がありました。getClass().getResource(/a/b/model) を使用してモデル クラスをロードし、注釈付きクラスを追加して、プログラムで hibernate を構成しています。

ここで、c3p0 を変更して、代わりに Tomcat JDBC 接続プールを使用するように求められました。いくつかの記事をたどったところ、明らかにすべてが正しくセットアップされています。問題は、モデル クラスをロードして休止状態を構成しようとするとエラーが発生することです。

hibernate を構成するクラス (HibernateConnector.class) は、webapps\MyApp\WEB-INF\lib\MyJar.jar の jar (MyJar) 内にあります。

getClass().getResource("HibernateConnector.class") を実行すると、次のパスを正しく取得できます: jar:file:/C:/apache-tomcat-7.0.29/webapps/MyApp/WEB-INF/lib/MyJar.jar !/a/b/c/HibernateConnector.class

getClass().getResource(/a/b/model) を要求するときに c3p0 を削除して Tomcat 接続プールを構成したので、 file:/C:/apache-tomcat-7.0.29/work/Catalina/localhost/MyApp/ を取得します。ローダー/a/b/モデル

ローディングに関するコードには触れていないので、明らかに新しい構成で奇妙なことが起こっています。誰もこれを解決する方法について考えを持っていますか? そして、なぜパスが仕事/カタリナに変わるのですか....?

長い投稿で申し訳ありませんが、事前に感謝します!!


Tomcat 接続プールを使用するために行った変更を次に示します。web.xml に次を追加しました。

<resource-ref>
 <description>This is a MySQL database connection</description>
 <res-ref-name>jdbc/myDb</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

context.xml:

<Context antiJARLocking="true" path="MyApp">
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="30" maxIdle="10" maxWait="10000" name="jdbc/myDb" password="pass"
type="javax.sql.DataSource" url="jdbc:mysql://localhost/myDb" username="user"/>
</Context>

そして、プログラムで Hibernate を構成します。

props.put("hibernate.connection.datasource", "java:comp/env/jdbc/myDb");
props.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
4

1 に答える 1

0

クラスローダーとTomcatがすべてをロードする方法に関する多くのリソースを調べた後、私の問題に特に役立つものは見つかりませんでした(ただし、この件については多くのことを学びました).

とにかく、上記の質問に記載した Web アプリケーションごとのコンテキスト XML ファイルに関する Tomcat のドキュメントを読み始めました。

何かがロックされており、より広範なアンチロックの取り組みが必要であると考えて、antiJARLocking=true を antiResourceLocking=true に切り替えました。その設定で、アプリを実行できました。しかし、antiResourceLocking は起動時間に重大な悪影響を与えるため、属性を削除してみてください (両方ともデフォルトで false)、それも機能しました!!! :-D.

私の context.xml は次のようになりました。

<Context path="MyApp">
   <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="30" maxIdle="10"    maxWait="10000" name="jdbc/myDb" password="pass" type="javax.sql.DataSource" url="jdbc:mysql://localhost/myDb" username="user"/>
</Context>

これが将来誰かに役立つことを願っています。

于 2012-08-25T01:28:14.780 に答える