47

我正在尝试在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有关 a 的文件,或DataSource

2)为任何数据库提供了一个示例,说明教程的代码应该是什么。

4

7 回答 7

130

您可能想要查看的一件事是Commons DBCP项目。它提供了一个与您的示例非常相似的配置的BasicDataSource 。要使用它,您需要在类路径中包含数据库供应商的 JDBC JAR,并且您必须以正确的格式指定供应商的驱动程序类名称和数据库 URL。

编辑:

如果你想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");

需要 a 的代码DataSource可以使用它。

于 2009-08-26T19:30:51.177 回答
23

基本上,在 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驱动程序没有,所以如果你不确定,注册第二个没有什么害处,它只是在内存中创建一个重复的对象。

于 2009-08-26T19:53:23.033 回答
23

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

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setDatabaseName("xyz");
    dataSource.setUser("xyz");
    dataSource.setPassword("xyz");
    dataSource.setServerName("xyz.yourdomain.com");
于 2014-04-01T21:19:52.303 回答
7

以 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;
}
于 2017-03-10T13:59:55.850 回答
2

我认为这个例子是错误的——javax.sql.DataSource也没有这些属性。您DataSource需要属于 type org.apache.derby.jdbc.ClientDataSource,它应该具有这些属性。

于 2009-08-26T19:26:52.480 回答
1

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

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

ClientDataSource ds = org.apache.derby.jdbc.ClientDataSource()
ds.setHost etc....
于 2009-08-26T19:18:13.433 回答
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

于 2021-03-17T04:36:38.883 回答