2011-10-03 127 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中的命名错误所致。如果没有错误的条目,请查看该文件!