【问题标题】:How do I manually configure a DataSource in Java?如何在 Java 中手动配置数据源?
【发布时间】:2010-11-23 03:22:01
【问题描述】:

我正在尝试在 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) 给出了一个示例,说明教程的代码应该是什么,适用于任何数据库。

【问题讨论】:

标签: java jdbc datasource


【解决方案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 的代码可以使用它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那行得通。我想要 DataSource,因为教程说它是首选,但我会接受它。
    • DataSource 真正适用于应用程序服务器和其他提供 JNDI 服务的容器。如果没有 JNDI 服务,它们就没有多大意义,而且说实话,教程在这一点上写得不是很好。
    • 您可以创建自己的类来使用上面的getConnection 方法的代码来实现DataSource 接口。除此之外,您只需要为 loginTimeout 和 LogWriter 实现 getter 和 setter。
    • @Yishai:感谢您的澄清。是的,本教程总体上不符合 Sun 的通常标准。
    • Datasource 的一个重要优势是能够依赖连接池
    【解决方案3】:

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

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

    【讨论】:

    • 如果您要回答 4.5 年前提出的问题,最好指出当前答案不足的原因。
    • 与官方接受的答案不同,这个答案直接解决了这个问题。谢谢@Luke。
    • MysqlDataSource 不在 MySQL 连接器 6 和 8 中,所以 BasicDataSource 更好。
    • @Xdg 这不正确。它已经移动了,但它就在那里。
    【解决方案4】:

    以 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;
    }
    

    【讨论】:

    • 当使用第二种方法时,它说不能从 DriverManagerDataSource 转换为 javax.sql.DataSource?
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        对于 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

        【讨论】:

          猜你喜欢
          • 2010-11-21
          • 2016-01-02
          • 2022-08-19
          • 2019-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-24
          • 1970-01-01
          相关资源
          最近更新 更多