2014-09-24 1 views
0

Я пытаюсь подключиться к базе данных оракула и направить результат на POJO. Однако я получаю ошибкуКак разрешить соединение фабрика возвращено null от createConnection

java.lang.IllegalStateException: Connection factory returned null from createConnection 

У меня были другие весенние проекты и никогда не сталкивались с этим вопросом, так понятия не имею, как его решить. Ниже я расскажу о моей конфигурации и классе.

Servlet XML Отрывок

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="${mnp.driverClassName}" /> 
    <property name="url" value="${mnp.url}" /> 
    <property name="username" value="${mnp.username}" /> 
    <property name="password" value="${mnp.password}" /> 
</bean> 

DAO Реализация

package cdjh.ops.mnpui.daos; 

import java.util.ArrayList; 

import javax.annotation.Resource; 

import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.jdbc.core.BeanPropertyRowMapper; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.stereotype.Repository; 

import cdjh.ops.mnpui.pojos.PacEntry; 
import cdjh.ops.mnpui.pojos.PortEntry; 
import cdjh.ops.mnpui.pojos.PortRecord; 

@Repository 
public class QueryDAO extends JdbcTemplate implements IQueryDAO{ 
    @Resource BasicDataSource dataSource; 

    @Override 
    public PortRecord findPortRecord(String msisdn, String pac){ 
     String sql = "select * from tbl_entry where msisdn = ? and pac_code = ?"; 
     PortRecord portRecord = queryForObject(sql, new Object[]{msisdn, pac}, new BeanPropertyRowMapper<PortRecord>(PortRecord.class)); 
     return portRecord; 
    } 

    public void setDataSource(BasicDataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    public BasicDataSource getDataSource() { 
     return dataSource; 
    } 
} 

StackTrace

java.lang.IllegalStateException: Connection factory returned null from createConnection 
    org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:584) 
    org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) 
    org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) 
    org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) 
    org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
    org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
    org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
    org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:573) 
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637) 
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666) 
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674) 
    org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:729) 
    cdjh.ops.mnpui.daos.QueryDAO.findPortRecord(QueryDAO.java:41) 
    cdjh.ops.mnpui.services.QueryService.findPortRecord(QueryService.java:33) 
    cdjh.ops.mnpui.controllers.QueryController.showPortRecord(QueryController.java:58) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:439) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:427) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 

UPDATE Я тестировал это против mysql db, который я построил, и он работает нормально, просто не работает против oracle. Единственное, что меняется, это файл jdbc.properties.

MySQL

mnp.driverClassName=com.mysql.jdbc.Driver 
mnp.url=jdbc:mysql://db4free.net:3306/mnpui 
mnp.username=XXX 
mnp.password=XXX 

Oracle

mnp.driverClassName=oracle.jdbc.OracleDriver 
mnp.url=jdbc:oracle:thin:[email protected]:1523 
mnp.username=XXX 
mnp.password=XXX 

мне нужно сделать что-то другое с оракулом, чтобы заставить его работать?

+0

Вы также поставляли JAR драйвер JARBC? – skaffman

+0

Да, я добавил файл jar классов, который я взял из установки oracle на сервере базы данных. У меня есть как классы12, так и connectorj на пути к классу, поэтому я могу протестировать mysql db перед выпуском war на производственный сервер, который использует oracle. –

+0

Драйвер 'class12' * действительно * старый. Попробуйте захватить более свежий драйвер JDBC с веб-сайта Oracle (например, «ojdbc6.jar») и посмотреть, улучшает ли он это. – skaffman

ответ

1

(Отмена оригинального комментария как ответа, поскольку он, похоже, устранил проблему).

classes12.zip Драйвер JDBC, который вы используете для подключения к Oracle, очень старый и предназначен для клиентов Java 1.2. Возможно, что DBCP Spring или Commons использует более современную версию JDBC для работы, поэтому вы должны использовать более современные odbc6.jar или ojdbc7.jar (для Java 6 и 7 соответственно, хотя эта связь несколько ослаблена и в значительной степени взаимозаменяема) вместо.

+0

@sksffmsn спасибо, я создал с помощью jav 1.6 и ojdbc6, и теперь все работает хорошо. –

0
  1. Не выдвигайте JdbcTemplate инкапсулировать его в дао
  2. Почему вы инъекционного источник данных, который никогда не передается в JdbcTemplate?
  3. Вы должны программировать на DataSource не BasicDataSource.
 

package cdjh.ops.mnpui.daos; 

import java.util.ArrayList; 

import javax.annotation.Resource; 

import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.jdbc.core.BeanPropertyRowMapper; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.stereotype.Repository; 

import cdjh.ops.mnpui.pojos.PacEntry; 
import cdjh.ops.mnpui.pojos.PortEntry; 
import cdjh.ops.mnpui.pojos.PortRecord; 

@Repository 
public class QueryDAO implements IQueryDAO{ 

    private final JdbcTemplate jdbcTemplate; 

    @Autowired 
    public QueryDao(DataSource dataSource) { 
     this.jdbcTemplate=new JdbcTemplate(dataSource); 
    } 


    @Override 
    public PortRecord findPortRecord(String msisdn, String pac){ 
     String sql = "select * from tbl_entry where msisdn = ? and pac_code = ?"; 
     PortRecord portRecord = this.jdbcTemplate.queryForObject(sql, new Object[]{msisdn, pac}, new BeanPropertyRowMapper(PortRecord.class)); 
     return portRecord; 
    } 
} 
 

Кроме того, убедитесь, что вы на самом деле с помощью источника данных, выполненный в конфигурации пружины. Слишком мало информации в вашем сообщении и в вашем первоначальном dao для polutedto быть уверенным в этом.

+0

Спасибо за указатели, я поправился, как вы предложили, но все равно столкнулся с нелегальнымStateException. –

+1

По-видимому, что-то не так с вашим драйвером. Судя по обновлениям/комментариям, вы используете jar-файл classes12, который действительно очень старый, он предназначался для java 1.2/1.3. Вы хотите перейти на веб-сайт Oracle и загрузить самую последнюю версию драйвера. –

Смежные вопросы