2012-06-29 68 views
1

我在Debian Squeeze上使用Apache 2.2.16,它爲/ var/www /使用不同域(例如phpApp1.com,phpApp2.com)提供一些PHP應用程序。使用mod_proxy_ajp連接Apache和Tomcat可行,但JDBC然後失敗

我還有一個工作的Tomcat 7.x,它位於/ opt/tomcat /中,並服務於一個位於/ opt/tomcat/webapps/MyApp /中的JSF + JPA應用程序。

因此,MyApp可以通過例如myapp.com:8080/MyApp/home.html或phpApp1.com:8080/MyApp/home.html(因端口而定)。因爲我想這是myapp.com/home.html相反,我與Apache和Tomcat使用的mod_proxy_ajp使用下面的配置文件:

一個Apache在/ etc/apache2的/網站可用/ MyApp的

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

而且在/opt/tomcat/conf/server.xml

<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的虛擬主機。所以tomcat中的AJP連接器應該可以工作。

但該應用程序無法建立一個JDBC連接,否則工作正常。無論我使用myapp.com還是myapp.com:8080都無關緊要,它無論如何都會失敗。但是,如果我通過http://phpapp1.com:8080/MyApp/home.html訪問我的應用程序,它就可以工作。它只在使用代理域「myapp.com」時失敗。

使用AJP和JDBC時有沒有人遇到類似的問題?我該如何解決這個問題?當使用mod_jk時,我也遇到了同樣的問題,它使用了AJP。提前致謝。

更新1

@馬克Rotteveel:你說的 「直接連接」 是什麼意思?我的意思是,如果我使用未列爲tomcats server.xml中的虛擬主機的域之一,則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 /班/ 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> 
+0

AJP的使用可能根本不涉及JDBC問題。我希望你會得到完全相同的錯誤,如果你直接連接到tomcat。如果你發佈了你得到的實際錯誤和tomcat日誌中的相關錯誤,那將會更有幫助。 –

回答

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閱讀this thread(作者的解決方案是在後最後一篇文章)。我沒有更改web.xmlcontext.xml,因爲這不是<Resource>元素的錯誤配置。無論如何,感謝您的幫助:)

0

確保你有你的mysql-connector-j.x.y.z.jar文件中只有一個地方:Tomcat的lib目錄。確保你的任何web應用程序'WEB-INF/lib directories中沒有流浪的副本。

兩個不相關的提示:

  1. 不要使用autoReconnect
  2. 使用/* ping */ SELECT 1爲您的驗證查詢:連接器/ J的最新版本將使用一個輕量級的「平」,而不是實際發放爲了查詢測試一個連接的有效性
+0

我已經仔細檢查過,我已經有/opt/tomcat/lib/mysql-connector-java-5.1.20-bin.jar,並且WEB-INF/lib中沒有其他驅動程序。感謝您的其他提示:) – Jack

+0

錯誤消息'無法爲連接URL'null'創建類的JDBC驅動程序總是由於''元素的錯誤配置或缺少/重複的JDBC庫JAR文件導致的。 –