Получение JDBC-соединения с помощью JNDI в Spring JDBC - PullRequest
6 голосов
/ 09 сентября 2010

Эта страница в Spring JDBC говорит

Класс DataSourceUtils… предоставляет статические методы для получения соединений из JNDI

Однако Насколько мне известно, документ API для DataSourceUtils не включает указанные статические методы.

Чего мне не хватает?

Ответы [ 3 ]

10 голосов
/ 09 сентября 2010

Как я понимаю, для вас было бы действительно полезно JndiObjectFactoryBean .Этот фабричный bean-компонент Spring возвращает объект, опубликованный в JNDI.

Вы можете настроить его следующим образом, а затем получить Connection, используя DataSourceUtils для введенного DataSource:

<bean name="myDataSourceInJndi" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:comp/env/jdbc/MyDataSource</value>
    </property>
</bean>

<bean name="myBean" class="MyClass">
...
    <property name="dataSource" ref="myDataSourceInJndi">        
...
</bean>
3 голосов
/ 09 сентября 2010

Хм ... Каким-то образом Javadoc из DataSourceUtils является более "точным" (я имею в виду, что документ не ошибается, но технически вы получаете соединение из источника данных - который можно получить через JNDI):

Вспомогательный класс, предоставляющий статические методы для получения соединений JDBC из DataSource.

И следующие методы должны быть тем, что вы ищете:

Базовый пример (из документации MySQL ):

// Create a new application context. this processes the Spring config
ApplicationContext ctx = new ClassPathXmlApplicationContext("ex1appContext.xml");
// Retrieve the data source from the application context
DataSource ds = (DataSource) ctx.getBean("dataSource");
// Open a database connection using Spring's DataSourceUtils
Connection c = DataSourceUtils.getConnection(ds);
try {
    // retrieve a list of three random cities
    PreparedStatement ps = c.prepareStatement(
        "select City.Name as 'City', Country.Name as 'Country' " +
        "from City inner join Country on City.CountryCode = Country.Code " +
        "order by rand() limit 3");
    ResultSet rs = ps.executeQuery();
    while(rs.next()) {
        String city = rs.getString("City");
        String country = rs.getString("Country");
        System.out.printf("The city %s is in %s%n", city, country);
    }
} catch (SQLException ex) {
    // something has failed and we print a stack trace to analyse the error
    ex.printStackTrace();
    // ignore failure closing connection
    try { c.close(); } catch (SQLException e) { }
} finally {
    // properly release our connection
    DataSourceUtils.releaseConnection(c, ds);
}
0 голосов
/ 13 октября 2017

Для дальнейших ссылок: jndi управляется на сервере приложений, то есть: standalone.xml (Wildfly) с драйвером Postgresql:

 <datasource jta="true" jndi-name="java:comp/env/jdbc/MyDataSource" pool-name="myDS" enabled="true">
                <connection-url>jdbc:postgresql:[<//host>[:<5432>/]]<database></connection-url>
                <driver>postgresql</driver>
                <security>
                    <user-name>$USER</user-name>
                    <password>$PWD</password>
                </security>
            </datasource>
...