2010-04-20 6 views
1

我正在編寫一個驅動程序,充當兩個單獨的MySQL連接(分佈式數據庫)的包裝。基本上,我們的目標是爲所有應用程序啓用與我的驅動程序的交互,而不是要求應用程序清理哪個數據庫保存所需的數據。無論連接URL如何,DriverManager總是返回我的自定義驅動程序

大部分代碼已經存在,但是我遇到了一個問題,當我嘗試通過MySQL驅動程序創建連接時,DriverManager正在返回我的驅動程序的實例而不是MySQL驅動程序。我很感激任何有關可能導致此問題的提示,以及可以採取哪些措施來解決問題!

下面是一些相關的代碼片段。我可以提供更多,但有很多,所以我需要知道你還想看什麼。

首先,從MyDriver.java:

public MyDriver() throws SQLException 
{ 
    DriverManager.registerDriver(this); 
} 

public Connection connect(String url, Properties info) 
    throws SQLException 
{ 
    try { return new MyConnection(info); } 
    catch (Exception e) { return null; } 
} 

public boolean acceptsURL(String url) 
    throws SQLException 
{ 
    if (url.contains("jdbc:jgb://")) 
    { return true; } 
    return false; 
} 

這是我的理解是,這acceptsURL功能將決定的DriverManager是否不認爲我的司機適當的適合於給定的URL。因此,如果URL包含「jdbc:jgb://」,那麼它只應該從我的驅動程序傳遞連接?

這裏的代碼MyConnection.java:

Connection c1 = null; 
Connection c2 = null; 

/** 
*Constructors 
*/ 
public DDBSConnection (Properties info) 
    throws SQLException, Exception 
{ 
    info.list(System.out); //included for testing 
    Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    String url1 = "jdbc:mysql://server1.com/jgb"; 
    String url2 = "jdbc:mysql://server2.com/jgb"; 
    this.c1 = DriverManager.getConnection(
      url1, info.getProperty("username"), info.getProperty("password")); 
    this.c2 = DriverManager.getConnection(
      url2, info.getProperty("username"), info.getProperty("password")); 
} 

這告訴我兩件事情。首先,info.list()調用確認正在發送正確的用戶和密碼。其次,因爲我們進入一個無限循環,我們看到DriverManager提供了我的連接的新實例,作爲匹配mysql的URL而不是所需的mysql驅動程序/連接。我已經單獨測試了使用這種精確語法直接訪問mysql驅動程序的實現(每次只有一個),並且能夠從我的驅動程序之外的測試應用程序單獨成功地與每個數據庫進行交互操作。

回答

3

IMO,這個代碼的主要問題是它使用DriverManager。避免靜態並堅持實例。

具體問題是DriverManager.getConnection直接嘗試connect而不是的acceptsURL。因此,您的執行應該執行與acceptsURL實現相同的檢查(它甚至可能會更嚴格,並可能在運行時失敗)。

作爲一個相對較小的點,acceptsURL實現有點奇怪。

if (url.contains("jdbc:jgb://")) 
{ return true; } 
return false; 

contains應該是startsWith。與ifreturn s的小舞沒有幫助清晰。它可以寫爲:

return url.startsWith("jdbc:jgb://"); 
+0

更正,'connect()'方法應該首先測試'accepurl()'。另請參閱[API文檔](http://java.sun.com/javase/6/docs/api/java/sql/Driver.html#connect%28java.lang.String,%20java.util.Properties%29) :*如果驅動程序意識到連接到給定的URL是錯誤的驅動程序,則應返回「null」。* – BalusC 2010-04-20 22:52:41

+0

感謝您提供有關重寫acceptURL的建議。我做了這個,並添加了一個DriverManager.getDriver(url)的調用;在每次調用getConnection之前。沒有改變。 我基於我用來調用3.1.2 http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/drivermanager.html 上的mysql驅動程序的代碼 如果有更好的建議,我願意將其切換。 – 2010-04-20 22:55:40

+0

啊!返回null是我錯過的部分!我已經這樣做了,事實上它不再進入無限循環。但是,DriverManager無法找到能夠處理mysql連接的驅動程序。 我是否需要要求用戶包括Class.forName(「com.mysql.jdbc.Driver」)。newInstance();打電話給我的司機? – 2010-04-20 22:58:47

相關問題