如何在Java中手动配置DataSource?

时间:2009-08-26 19:16:19

标签: java jdbc 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)com.mysql.jdbc关于我能理解的DataSource的文档,或

2)为任何数据库提供了教程代码应该的示例。

7 个答案:

答案 0 :(得分:125)

您可能想要了解的一件事是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的代码可以使用该代码。

答案 1 :(得分:20)

基本上在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

编辑:还有一个想法,技术上只有一行代码可以运行Class.forName(“com.mysql.jdbc.Driver”)就足够了,因为类应该有自己的静态初始化程序来注册版本,但有时候JDBC驱动程序没有,所以如果你不确定,注册第二个就没有什么害处,它只是在memeory中创建了一个重复的对象。

答案 2 :(得分:20)

DataSource是特定于供应商的,对于MySql,您可以使用MySql Java连接器jar中提供的MysqlDataSource:

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

答案 3 :(得分:2)

我认为这个例子是错误的 - javax.sql.DataSource也没有这些属性。您的DataSource必须属于org.apache.derby.jdbc.ClientDataSource类型,应该具有这些属性。

答案 4 :(得分:2)

使用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;
}

答案 5 :(得分:1)

您引用的DataSource的javadoc是错误的包。你应该看看javax.sql.DataSource。如您所见,这是一个界面。主机和端口名称配置取决于实现,即您使用的JDBC驱动程序。

我没有检查过Derby javadocs,但我想代码应该像这样编译:

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

答案 6 :(得分:0)

对于 postgres,以下是有效的。我实际上在整数测试中使用了它。我想应该更多地考虑生产用途。

PGSimpleDataSource ds = new PGSimpleDataSource() ;  
ds.setServerName( "localhost" );  
ds.setDatabaseName( "your_db_name_here" );   
ds.setUser( "scott" );       
ds.setPassword( "tiger" );   

该类捆绑在 postgres jdbc 驱动程序中。

我关注的原始 stackoverflow 帖子:https://stackoverflow.com/a/45091982/3877642