1

Debian Squeeze で動作する Apache 2.2.16 を使用しています。これは、異なるドメイン (phpApp1.com、phpApp2.com など) を使用して /var/www/ からいくつかの PHP アプリケーションを提供します。

また、/opt/tomcat/ に存在する動作中の Tomcat 7.x もあり、/opt/tomcat/webapps/MyApp/ に存在する JSF+JPA アプリケーションを提供しています。

したがって、MyApp には、たとえば myapp.com:8080/MyApp/home.html または phpApp1.com:8080/MyApp/home.html (ポートのため) からアクセスできます。これを代わりに myapp.com/home.html にしたかったので、次の構成ファイルを使用して mod_proxy_ajp を使用して Apache と Tomcat を接続しました。

/etc/apache2/sites-available/MyApp の Apache 仮想ホスト

<Virtualhost *:80>
    ServerName myapp.com
    ServerAlias *.myapp.com
    ProxyPass / ajp://localhost:8009/
    ProxyPassReverse / ajp://localhost:8009/
</Virtualhost>

/opt/tomcat/conf/server.xml の Tomcat 仮想ホスト

<Host name="myapp.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="" reloadable="true" debug="0" docBase="MyApp" />
    <Alias>www.myapp.com</Alias>
</Host>

これは、 http: //myapp.com/home.html にアクセスして、css、画像、および js を含む正しい html ページを取得できるようになるまで機能します。したがって、Tomcat の AJP コネクタは機能するはずです。

しかし、アプリは、それ以外の場合は正常に機能する JDBC 接続の確立に失敗します。myapp.com と myapp.com:8080 のどちらを使用しても問題ありません。いずれにしても失敗します。ただし、 http://phpapp1.com:8080/MyApp/home.htmlを介してアプリにアクセスすると機能します。プロキシ ドメイン「myapp.com」を使用した場合にのみ失敗します。

AJP と JDBC を使用しているときに同様の問題を経験した人はいますか? どうすればこれを解決できますか? AJP を利用する mod_jk を使用する場合も同じ問題がありました。前もって感謝します。

更新 1

@Mark Rotteveel: 「直接接続する」とはどういう意味ですか? Tomcats server.xml に仮想ホストとしてリストされていないドメインの 1 つを使用すると、JDBC 接続が機能していることを意味します。

接続エラーは次のとおりです。

ERROR: HHH000231: Schema export unsuccessful
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141)
at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:51)
at org.hibernate.tool.hbm2ddl.DatabaseExporter.<init>(DatabaseExporter.java:52)
at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:367)
at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:304)
at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:293)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:492)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at com.myapp.util.database.Database.<init>(Database.java:70)
at com.myapp.util.database.Database.<clinit>(Database.java:38)
at com.myapp.controller.file.UploadBacking.ajaxUpload(UploadBacking.java:89)
at com.myapp.controller.file.UploadBacking$Proxy$_$$_WeldClientProxy.ajaxUpload(UploadBacking$Proxy$_$$_WeldClientProxy.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96)
at org.apache.myfaces.view.facelets.tag.jsf.core.AjaxHandler$AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxHandler.java:495)
at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:57)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:74)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:405)
at javax.faces.component.UICommand.broadcast(UICommand.java:103)
at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:1028)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:286)
at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1375)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:38)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:183)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:507)
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:476)
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
at java.sql.DriverManager.getDriver(DriverManager.java:253)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 60 more

Database.java から:

private Database() {
    entityManagerFactory = Persistence.createEntityManagerFactory("myapp_persistence_unit");
}

MyApp/META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Context>

<Context>

<Resource
    name="jdbc/db_myapp" 
    auth="Container"
    type="javax.sql.DataSource" 
    username="user_myapp" 
    password="##########"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/db_myapp?autoReconnect=true"
    validationQuery="select 1"
    maxActive="15" 
    maxIdle="3" />

<Valve
    className="org.apache.catalina.valves.AccessLogValve"
    directory="logs/myapp"
    prefix="myapp_access_"
    suffix=".log"
    pattern="%h %l %u %t &quot;%r&quot; %s %b"
    resolveHosts="false" />

</Context>

WEB-INF/web.xml より

<resource-ref>
    <description>MySQL database</description>
    <res-ref-name>jdbc/db_myapp</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

そして最後に WEB-INF/classes/META-INF/persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="myapp_persistence_unit">
        <properties>
            <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/db_myapp" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.current_session_context_class" value="thread" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        </properties>
    </persistence-unit>

</persistence>
4

2 に答える 2

3

私はついにそれを働かせました。tomcat で仮想ホストを作成する場合は、アプリケーションの正確なコピーを に入れ、/META-INF/context.xml名前/tomcat/conf/Catalina/domain.com/を付ける必要がありますcontext.xml.default。まあ、これが常に当てはまるかどうかはわかりませんが、私の設定ではそうでした。したがって、これらは仕事をする私の現在の設定ファイルです:

/etc/apache2/sites-enabled/domain.com

<Virtualhost *:80>
    ServerName domain.com
    ServerAlias *.domain.com

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / ajp://my.server.ip:8009/
</Virtualhost>

/tomcat/conf/server.xml

<Host name="domain.com">
    <Context path="" docBase="MyApp" />
    <Alias>www.domain.com</Alias>
</Host>

2006年からcoderanch.comでこのスレッドを読んだ後、これを試しました(著者の解決策は最後の投稿にあります)。これは要素の構成ミスではないため、 web.xmlorは変更しませんでした。とにかく、助けてくれてありがとう:)context.xml<Resource>

于 2012-08-08T08:20:39.993 に答える
0

mysql-connector-j.x.y.z.jarファイルが正確に 1 つの場所 (Tomcat のディレクトリ) にあることを確認してくださいlib。どの webapps にも不要なコピーがないことを確認してくださいWEB-INF/lib directories

2 つの無関係なヒント:

  1. 使用しないでくださいautoReconnect
  2. 検証クエリとして使用/* ping */ SELECT 1: Connector/J の最近のバージョンでは、接続の有効性をテストするために、実際にクエリを発行する代わりに、軽量の「ping」を使用します。
于 2012-07-01T00:45:14.827 に答える