Как вручную настроить источник данных в Java? - PullRequest
43 голосов
/ 26 августа 2009

Я пытаюсь следовать руководству Sun по JDBC на http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.html

Это дает следующий пример кода:

DataSource ds = (DataSource) org.apache.derby.jdbc.ClientDataSource()
ds.setPort(1527);
ds.setHost("localhost");
ds.setUser("APP")
ds.setPassword("APP");

Connection con = ds.getConnection();

Этот код не компилируется, потому что интерфейс DataSource не имеет ни одного из этих методов, за исключением метода getConnection(), который вызывался последним.

(Вот этот javadoc: http://java.sun.com/javase/6/docs/api/javax/sql/DataSource.html)

Чего мне не хватает?

Edit: Я на самом деле пытаюсь подключиться к MySQL (com.mysql.jdbc), и я не могу найти Javadoc для этого. Я приму ответ, который укажет мне либо:

1) документация для com.mysql.jdbc относительно DataSource, которую я могу понять, или

2) приводит пример, которому следует следовать для кода учебника , , для любой базы данных.

Ответы [ 6 ]

125 голосов
/ 26 августа 2009

Вы можете захотеть взглянуть на проект Commons DBCP . Он предоставляет BasicDataSource , который настроен довольно похоже на ваш пример. Чтобы использовать это, вам нужен JDBC JAR поставщика базы данных в вашем пути к классам, и вы должны указать имя класса драйвера поставщика и URL базы данных в правильном формате.

Edit:

Если вы хотите настроить BasicDataSource для MySQL, вы должны сделать что-то вроде этого:

BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("username");
dataSource.setPassword("password");
dataSource.setUrl("jdbc:mysql://<host>:<port>/<database>");
dataSource.setMaxActive(10);
dataSource.setMaxIdle(5);
dataSource.setInitialSize(5);
dataSource.setValidationQuery("SELECT 1");

Код, который нуждается в DataSource, может затем использовать это.

20 голосов
/ 02 апреля 2014

DataSource зависит от поставщика, для MySql вы можете использовать MysqlDataSource, который предоставляется в jar-коннекторе MySql Java:

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setDatabaseName("xyz");
    dataSource.setUser("xyz");
    dataSource.setPassword("xyz");
    dataSource.setServerName("xyz.yourdomain.com");
20 голосов
/ 26 августа 2009

По сути, в JDBC большинство этих свойств не настраиваются в API-интерфейсе, а зависят от реализации. JDBC обрабатывает это, позволяя различать URL-адрес подключения для каждого поставщика.

Итак, вы регистрируете драйвер, чтобы система JDBC могла знать, что делать с URL:

 DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance());

Затем вы формируете URL:

 String url = "jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]"

И, наконец, используйте его для установления соединения:

 Connection c = DriverManager.getConnection(url);

В более изощренном JDBC вы участвуете в пулах соединений и т. П., И у серверов приложений часто есть свой собственный способ регистрации драйверов в JNDI, и вы ищите оттуда DataSource и вызываете для него getConnection.

Что касается свойств, поддерживаемых MySQL, см. здесь .

РЕДАКТИРОВАТЬ: еще одной мысли, технически просто иметь строку кода, которая делает Class.forName ("com.mysql.jdbc.Driver") должно быть достаточно, так как класс должен иметь свой собственный статический инициализатор, который регистрирует версию, но иногда драйвер JDBC этого не делает, поэтому, если вы не уверены, что зарегистрировать второй драйвер мало, он просто создает дубликат объекта в памяти.

2 голосов
/ 10 марта 2017

используйте MYSQL в качестве примера: 1) использовать пулы соединений с базой данных: например: Apache Commons DBCP, вам также необходим пакет jar basicDataSource в вашем classpath

@Bean
public BasicDataSource dataSource() {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/gene");
    ds.setUsername("root");
    ds.setPassword("root");
    return ds;
}

2) использовать драйвер на основе JDBC, обычно он используется, если вы не учитываете пул соединений:

@Bean
public DataSource dataSource(){
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/gene");
    ds.setUsername("root");
    ds.setPassword("root");
    return ds;
}
2 голосов
/ 26 августа 2009

Я думаю, что пример неправильный - javax.sql.DataSource также не имеет этих свойств. Ваш DataSource должен быть типа org.apache.derby.jdbc.ClientDataSource, который должен иметь эти свойства.

1 голос
/ 26 августа 2009

Javadoc для источника данных, на который вы ссылаетесь, имеет неправильный пакет. Вы должны посмотреть на javax.sql.DataSource . Как видите, это интерфейс. Конфигурация имени хоста и имени порта зависит от реализации, то есть используемого вами драйвера JDBC.

Я не проверял Javadocs Derby, но я полагаю, что код должен компилироваться следующим образом:

ClientDataSource ds = org.apache.derby.jdbc.ClientDataSource()
ds.setHost etc....
...