2015-12-24 52 views
3

我需要將sqljdbc42.jar庫添加到類路徑中,以便我可以連接到Azure SQL數據庫。我可以如何(如果可能)在Azure Web服務 - Web應用程序(帶有Tomcat服務器的Java)中執行此操作。有沒有其他的方式來添加JDBC庫?Azure Java Web App將類庫添加到類路徑

服務器錯誤:

java.sql.SQLException: No suitable driver found for jdbc:sqlserver://XXXXXXX.database.windows.net:1433;database=XXXXXX;[email protected];password=XXXXXXXX;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30; 
    at java.sql.DriverManager.getConnection(DriverManager.java:689) 
    at java.sql.DriverManager.getConnection(DriverManager.java:270) 
    at common.DBConnection.<init>(DBConnection.java:23) 
    at servlets.Login.doPost(Login.java:77) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Dec 30, 2015 3:04:48 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [servlets.Login] in context with path [/deviceweb] threw exception 
java.lang.NullPointerException 
    at common.DBConnection.addParameter(DBConnection.java:33) 
    at servlets.Login.doPost(Login.java:78) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

網頁錯誤:

type: Exception report 

    message: 

    description: The server encountered an internal error that prevented it from fulfilling this request. 

    exception: 

    java.lang.NullPointerException 
     common.DBConnection.addParameter(DBConnection.java:33) 
     servlets.Login.doPost(Login.java:78) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

note: The full stack trace of the root cause is available in the Apache Tomcat/8.0.30 logs. 

連接字符串:

String connectionString = "jdbc:sqlserver://testnabaza.database.windows.net:1433;" + "database=testnabaza;" 
      + "[email protected];" + "password=1!qQaaaaaa;" + "encrypt=true;" 
      + "trustServerCertificate=false;" + "hostNameInCertificate=*.database.windows.net;" + "loginTimeout=30;"; 

從門戶網站複製: JDBC:SQLSERVER://testnabaza.database。 windows.net:1433;database=testnabaza;[email protected];password={your_password_here };加密= TRUE; trustServerCertificate =假; hostNameInCertificate = * database.windows.net; loginTimeout = 30;

回答

0

我從Azure團隊裏面說,我是不是possibe與Web應用程序來解決這個問題的答覆,但我需要創建雲服務:

Unfortunately JDBC libraries fall into an area where Tomcat pretty much forces you to put them in CATALINA_HOME\lib but then you need to make sure that the driver you put in will work for all your web apps in that Tomcat.

From what I remember this is tied to Tomcat memory leak prevention which makes Tomcat only scan CATALINA_HOME\lib once at Tomcat startup for database drivers. There are good reasons to do this tied to how the drivers register themselves with the JVM and how that impacts the classloader. Even if you wanted to disable this behaviro, you'd have to edit server.xml which would again drive you to have your own Tomcat install.

So the result of my rambling narrative is that you need to install Tomcat from the gallery or upload your own version and then drop your JDBC drivers in your Tomcat\lib directory. You are trying to do more than you can with the UI enablement of Java for your app.

https://azure.microsoft.com/en-us/documentation/articles/web-sites-java-add-app/

有在互聯網上過時的教程,但可以幫助找出該怎麼做。 subhash singh鏈接幫助我的一般想法,但教程已過時,有點混亂。

2

最簡單的方法是簡單地將sqljdbc42.jar文件(可能位於C:\ Program Files \ Microsoft SQL Server JDBC Driver \ sqljdbc_3.X \ enu)添加到本地Java的\ lib \ ext目錄在創建.zip文件之前安裝。

的最好的幫助使用給定鏈路 https://dzone.com/articles/java-access-sql-azure-jdbc

+0

你能解釋一點,因爲我沒有創建與.WAR文件導出的.zip文件。這個lib/ext應該在哪裏?我只有文件夾:WebContent/WEB-INF/lib(動態web項目) – ButterBeast

2

按我的經驗,加上sqljdbc42.jar庫的簡單方法的類路徑(請從官方網站https://www.microsoft.com/en-US/download/details.aspx?id=11774下載)是拖動或複製JDBC驅動程序文件到Eclipse的Dynamic Web Project目錄WebContent/WEB-INF/lib,請參閱下圖。

enter image description here

當您導出從​​在Eclipse項目的WAR文件,庫文件將被納入進去。然後,您可以使用Tomcat將戰爭文件部署到Azure WebApp for Java,並且它可以正常工作。


在大多數情況下,例外java.sql.SQLException: No suitable driver found是由不正確的url引起的。請檢查您的連接字符串並將其正確用於Java jdbc編程。

作爲參考,這是我的簡單代碼。

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
String jdbcUrl = "jdbc:sqlserver://<host>.database.windows.net:1433;database=<database>;user=<username>@<host>;password=<password>;encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"; 
String user = "<username>@<host>"; 
String password = "<password>"; 
Connection conn = DriverManager.getConnection(jdbcUrl, user, password); 
PreparedStatement statement = conn.prepareStatement("select 1 as id, 'peter' as name"); 
ResultSet rs = statement.executeQuery(); 
while(rs.next()) { 
    System.out.println(rs.getLong("id")+","+rs.getString("name")); 
} 
rs.close(); 
statement.close(); 
+0

感謝您的答案,但我試過了,它不起作用。它適用於其他庫(Gson,...),但不適用於sqljdbc42.jar庫。你試過了嗎? – ButterBeast

+0

@ButterBeast是的,我做到了。如果這種方式不起作用,你能提供任何錯誤信息,比如'java.lang.NoClassDefFoundError'嗎?根據我的經驗,我認爲你可以檢查服務器IP是否將它添加到「允許的IP地址」列表中。你可以通過Azure SQL數據庫'DASHBOARD'標籤頁右側的'Manage allowed ip addresses'鏈接設置允許的ip。 –

+0

我在編輯下添加了錯誤。我嘗試添加IP-s,但是我不知道這是問題,因爲即使我在CLASSPATH中有文件的時候在本地運行它,當我刪除它時,我也會得到這個錯誤(兩次我都在本地運行)。 – ButterBeast