2014-01-16 120 views
0

我有這個Java應用程序,我正在開發一個模塊,它可以從文件讀取和執行SQL語句並輸出查詢結果。如果我通過它的主要方法啓動模塊,它工作正常。我給出了數據庫連接設置文件(包括用戶,傳遞,端口等等)的路徑,包含SQL查詢的文件的路徑以及輸出文件的名稱。正如我所說,以獨立方式啓動,它工作正常,連接沒有問題,執行查詢並輸出結果。 如果我將它集成到應用程序工作流程中,即使證書(即數據庫連接設置文件)相同,它也無法連接到數據庫。我試圖將它包裝在一個線程中,試圖搜索是否需要異步啓動連接,但沒有任何幫助。 mysql-connector-java-5.1.28在類路徑中,一切看起來都很好。我也嘗試設置autoReconnect(註釋行),但它也失敗了。這是創建連接的代碼:無法使用JDBC連接到MySQL數據庫

String url = "jdbc:mysql://"+server+":3306/?useCursorFetch=true"; 
//String url = "jdbc:mysql://"+server+":3306/?autoReconnect=true"; 

try { 
    return DriverManager.getConnection(url, user, password); 
} catch (SQLException e1) { 
     Logging.outputStackTrace(e1); 
     throw new RuntimeException("Cannot connect to DB server: " + e1.getMessage()); 

with server = localhost。用戶和通行證很好,很抱歉第三次重複,連接成功時通過模塊的主要方法啓動。 這是堆棧跟蹤我得到通過應用程序運行時模塊:

ERROR: An error occurred : Could not create connection to database server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
Check the error log for details 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
java.lang.reflect.Constructor.newInstance(Unknown Source) 
com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
com.mysql.jdbc.Util.getInstance(Util.java:386) 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2575) 
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2311) 
com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834) 
com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
java.lang.reflect.Constructor.newInstance(Unknown Source) 
com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347) 
java.sql.DriverManager.getConnection(Unknown Source) 
java.sql.DriverManager.getConnection(Unknown Source) 
org.application.utilities.DBConnection.connectToMySQL(DBConnection.java:144) 
org.application.utilities.DBConnection.connect(DBConnection.java:107) 
org.application.utilities.RunSQL.run(RunSQL.java:110) 
org.application.workflow.Processing.extractData(Processing.java:201) 
org.application.workflow.Processing.<init>(Processing.java:73) 
org.application.gui.ApiGUI$2.actionPerformed(ApiGUI.java:349) 
javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
java.awt.Component.processMouseEvent(Unknown Source) 
javax.swing.JComponent.processMouseEvent(Unknown Source) 
java.awt.Component.processEvent(Unknown Source) 
java.awt.Container.processEvent(Unknown Source) 
java.awt.Component.dispatchEventImpl(Unknown Source) 
java.awt.Container.dispatchEventImpl(Unknown Source) 
java.awt.Component.dispatchEvent(Unknown Source) 
java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
java.awt.Container.dispatchEventImpl(Unknown Source) 
java.awt.Window.dispatchEventImpl(Unknown Source) 
java.awt.Component.dispatchEvent(Unknown Source) 
java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
java.awt.EventQueue.access$200(Unknown Source) 
java.awt.EventQueue$3.run(Unknown Source) 
java.awt.EventQueue$3.run(Unknown Source) 
java.security.AccessController.doPrivileged(Native Method) 
java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
java.awt.EventQueue$4.run(Unknown Source) 
java.awt.EventQueue$4.run(Unknown Source) 
java.security.AccessController.doPrivileged(Native Method) 
java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
java.awt.EventQueue.dispatchEvent(Unknown Source) 
java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
java.awt.EventDispatchThread.run(Unknown Source) 

任何想法,爲什麼發生這種情況?這是一個線程相關的問題? GUI的事件管理器可以處理它嗎?沒有多個連接或併發連接到數據庫。只有一次,完成後關閉。通過MySQL命令行,我也可以訪問我的數據庫,我確保服務器每次都啓動,等等...... 謝謝。

回答

4

我想你忘了提數據庫名

String url = "jdbc:mysql://"+server+":3306/?useCursorFetch=true"; 

必須

String url = "jdbc:mysql://"+server+":3306/DB_NAME?useCursorFetch=true"; 
+0

感謝您的快速回復。數據庫名稱不是問題。它不連接到服務器,它不是找不到模式或數據庫的問題。正如我所說的那樣,它可以很好地處理我在帖子中提到的那個URL。我添加了數據庫名稱,它仍然是相同的行爲。任何其他想法? – Marius

+0

其他明智的看起來完美嗎? 你是否從文件中提取連接詳細信息所以可能有可能的空間中導致問題的原因,所以嘗試通過從您的主要方法 中的文件中獲取詳細信息來測試連接,因爲我已經遇到此問題的屬性文件 希望這可以幫助 –

+0

I知道你的意思,也有同樣的問題與屬性,但我檢查和雙重檢查空間,修剪每個條目從連接細節文件,硬編碼整個網址,以及用戶,通過,但什麼也沒有。現在我正在試圖看看它是不是與它混亂的美國東部時間。直到現在,我在API的頂部都有一個接口。它看起來像一些線程併發或什麼.. – Marius

1

確定。得到它了。當我通過應用程序在運行SQL模塊,我通過

System.setProperty("file.encoding", "ANSI"); 

這是不是這種情況,而運行它獨立設置文件編碼爲ANSI。 顯然,DriverManager.getConnection(url,user,pass)不會自行設置字符集,以確保它以兼容的字符編碼發送請求。也許這應該在java.sql包中解決。