Я пишу драйвер для работы в качестве оболочки вокруг двух отдельных подключений MySQL (к распределенным базам данных). В принципе, цель заключается в том, чтобы включить взаимодействие с моим драйвером для всех приложений, вместо того чтобы требовать от приложения сортировки, какая база данных содержит нужные данные.DriverManager всегда возвращает мой пользовательский драйвер, независимо от URL-адреса подключения.
Большая часть кода для этого на месте, но у меня возникла проблема в том, что при попытке создать соединения через драйвер 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 предоставляет новые экземпляры моего соединения в качестве совпадений для URL-адресов mysql вместо желаемого драйвера/соединения mysql.
FWIW, я отдельно тестировал реализации, которые идут прямо к драйверу mysql, используя этот точный синтаксис (al beit только по одному) и смог успешно взаимодействовать с каждой базой данных отдельно от тестового приложения за пределами моего драйвера ,
Правильно, метод 'connect()' должен сначала протестировать 'acceptsURL()'. Также см. [API doc] (http://java.sun.com/javase/6/docs/api/java/sql/Driver.html#connect%28java.lang.String,%20java.util.Properties%29) : * Драйвер должен возвращать «null», если он понимает, что это неправильный тип драйвера для подключения к указанному URL. * – BalusC
Спасибо за предложение о переписывании acceptsURL. Я сделал это и добавил вызов DriverManager.getDriver (url); перед каждым вызовом getConnection. Никакого изменения. Я основываю код, который я использую, чтобы вызвать драйверы mysql в 3.1.2 http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/drivermanager.html Я открыт для переключения, если есть лучшее предложение. –
Ах! Возврат null был частью, которую я отсутствовал! Я сделал это, и действительно, он больше не входит в бесконечный цикл. Однако DriverManager не находит драйвер, способный обрабатывать соединение mysql. Нужно ли требовать, чтобы пользователи включали Class.forName ("com.mysql.jdbc.Driver"). NewInstance(); перед вызовом моего водителя? –