我正试图在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)为任何数据库提供了教程代码应该的示例。
答案 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