web-dev-qa-db-ja.com

JavaでDataSourceを手動で構成するにはどうすればよいですか?

http://Java.Sun.com/docs/books/tutorial/jdbc/basics/connecting.html でSunのJDBCチュートリアルをフォローしようとしています。

次のコード例を示します。

_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

私は何が欠けていますか?

編集:私は実際にMySQL(_com.mysql.jdbc_)に接続しようとしていますが、そのためのjavadocが見つかりません。次のいずれかを指す回答を受け入れます。

1)理解できるDataSourceに関する_com.mysql.jdbc_のドキュメント、または

2)データベースのチュートリアルのコードがどうあるべきかに従うべき例を示します。

43
Eric Wilson

基本的に、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がサポートするプロパティについては、 here を参照してください。

編集:もう1つの考え、技術的にはClass.forName( "com.mysql.jdbc.Driver")を実行するコード行があれば十分です。クラスにはバージョンを登録する独自の静的イニシャライザが必要ですが、時にはJDBCドライバーはサポートしていないので、よくわからない場合、2番目のドライバーを登録してもほとんど問題はありません。それは単に重複したオブジェクトを記憶に作成するだけです。

20
Yishai

ご覧になりたいものの1つは、 Commons DBCP プロジェクトです。これは、 BasicDataSource を提供します。これは、例とほぼ同様に構成されています。それを使用するには、クラスパスにデータベースベンダーのJDBC JARが必要であり、ベンダーのドライバークラス名とデータベースURLを適切な形式で指定する必要があります。

編集:

MySQLのBasicDataSourceを設定する場合、次のようなことを行います。

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を必要とするコードはそれを使用できます。

126
ColinD

DataSourceはベンダー固有です。MySqlの場合、MySql Javaコネクタjarで提供されるMysqlDataSourceを使用できます。

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setDatabaseName("xyz");
    dataSource.setUser("xyz");
    dataSource.setPassword("xyz");
    dataSource.setServerName("xyz.yourdomain.com");
20
Luke

例としてMYSQLを使用:1)データベース接続プールを使用:例:Apache Commons DBCP、また、クラスパスにbasicDataSource jarパッケージが必要

@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;
}
3
Fujian lin

この例は間違っていると思います- javax.sql.DataSource にはこれらのプロパティもありません。 DataSourceorg.Apache.derby.jdbc.ClientDataSource型である必要があり、shouldはそれらのプロパティを持っています。

2
Vinay Sajip

参照するDataSourceのjavadocのパッケージが間違っています。 javax.sql.DataSource をご覧ください。ご覧のとおり、これはインターフェイスです。ホストおよびポート名の構成は、実装、つまり使用しているJDBCドライバーによって異なります。

私はDerbyのjavadocsをチェックしていませんが、コードは次のようにコンパイルするはずです。

ClientDataSource ds = org.Apache.derby.jdbc.ClientDataSource()
ds.setHost etc....
1
Kees de Kooter