2011-10-03 68 views
1

問候,我有一些JDBC問題,它太慢了,它不可信。Slackware 12真的很慢JDBC

與Windows連接到遠程數據庫相同的代碼完美工作。

但是對於slackware,連接需要30秒,而第一次嘗試總是失敗。我必須做一個解決方法,讓它再試一次,以確保它連接。但即使它不應該那麼慢。

在bash中使用mysql命令似乎立即連接。

下面是用於創建數據庫

public static Object createDBConnection(String dbType, String host, String hostPort, String dbName, String userName, String password) { 

    String connectionString = buildConnectionString(dbType, host, hostPort, dbName, userName, password); 
    Connection connection = null; 

    try { 
     if(dbType.equals(K_dbTypeMySQL)){    
      Class.forName("com.mysql.jdbc.Driver"); 
     }else if(dbType.equals(K_dbTypeSqlServer)){ 
      Class.forName("net.sourceforge.jtds.jdbc.Driver");    
     }else if(dbType.equals(K_dbTypeSqlServerExpress)){ 
      Class.forName("net.sourceforge.jtds.jdbc.Driver");    
     }else if(dbType.equals(K_dbTypePostgres)) { 
      Class.forName("org.postgresql.Driver"); 
     } 


     connection = DriverManager.getConnection(connectionString); 
     return connection; 

    } 
    catch (Exception e) 
    {    
     e.printStackTrace(); 
     return null; 
    }  
} 

public static String buildConnectionString(String dbType, String host, String hostPort, String dbName, String userName, String password){ 
    String connectionString = null; 
    if((dbType.equals(K_dbTypeMySQL))){ 
     connectionString = "jdbc:mysql://" + host + ":" + hostPort + "/" + dbName + "?user=" + userName + "&password=" + password; 
    }else if((dbType.equals(K_dbTypeSqlServer))) 
     connectionString = "jdbc:jtds:sqlserver://" + host + ":" + hostPort + ";databaseName=" + dbName + ";selectMethod=cursor;user=" + userName + ";password=" + password;   
    else if((dbType.equals(K_dbTypeSqlServerExpress))) 
     connectionString = "jdbc:jtds:sqlserver://" + host + ":" + hostPort + ";databaseName=" + dbName + ";selectMethod=cursor;user=" + userName + ";password=" + password; 
    else if(dbType.equals(K_dbTypePostgres)) 
     connectionString = String.format("jdbc:postgresql://%s:%s/%s?user=%s&password=%s",host,hostPort,dbName,userName,password); 


    return connectionString; 
} 

我使用不同的驅動程序,但同樣的事情試過了,第一次嘗試總是需要永遠連接(20秒)的代碼,第二次採取類似2秒。

我試圖用URLConnection第一次打開一個https url始終失敗,第二次沒有問題時,也有同樣的問題。

任何人有任何關於這個問題的見解? 因爲我用java打開HTTPS url有問題,可能是SSL的問題? MySQL以任何方式使用SSL?

服務器版本:5.1.41

主機:本地主機

JDBC驅動程序:5.1.8,5.1.12,5.1.17(都有同樣的問題)

Java構建: 根Java™版本「1.6.0_06」 Java™SE運行時環境(版本1.6.0_06-b02) Java HotSpot™客戶端VM(版本10.0-b22,混合模式,共享)

//編輯 127.0.0.1和本地主機做了同樣的問題

感謝您的幫助,但


沒什麼,DBManager.createConnection掛起20秒。我嘗試從另一臺機器連接,並且工作完美無瑕。

+0

您是否嘗試過使用VisualVM進行分析以查看它是否顯示明顯的慢點? – millimoose

+0

不,我不這麼做,不幸的是它是一臺嵌入式計算機,我在ssh旁邊沒有任何GUI。沒有安裝窗口管理器 – gimpycpu

+0

如果它運行Sun JDK,則仍然可以通過啓用JMX來遠程運行VisualVM。如果您無法直接訪問JMX端口,請通過ssh進行端口轉發。 –

回答

2

查找您指定的名稱時,30秒鐘會顯示類似DNS超時的異味。

您可以使用IP地址作爲主機名來進行確認。

+0

謝謝你的回覆,但是127.0.0。1和localhost做同樣的問題 – gimpycpu

+0

@ user977194:沒關係。 MySQL只會看到來自IP的連接,並嘗試對其進行反向DNS查找 - 在users表中可能有[email protected]而不是[email protected]。它**有**檢查,所以反向查找將始終執行。 –

0

看起來像MySQL試圖解決客戶端使用nslookup。在當前的情況下,客戶端有127.0.0.1或192.168.1.XXX。我認爲這是由於/etc/hosts中的命名錯誤所致。如果沒有錯誤的條目,請查看該文件!