Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring. Подключение к базе. Чтение properties. / 7 сообщений из 7, страница 1 из 1
23.10.2014, 14:58
    #38785536
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
Хочу посоветоваться как лучше сделать.

Сначала опишу, что имею.

Проект на spring.
Работа с базой организована через hibernate.
Файл(jdbc.properties) с параметрами подключения лежит в папке WEB-INF.
В файле spring-servlet.xml инициализация подключения:
Код: xml
1.
2.
3.
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
		p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />


Теперь возникла необходимость вызывать хранимые процедуры, которые возвращают курсор.
Подключение делаю так:
Код: java
1.
2.
			Class.forName("oracle.jdbc.OracleDriver");
			con = DriverManager.getConnection ("jdbc:oracle:thin:@10.0.0.10:1521:xe", "user", "password");


Все работает - курсор из хранимых процедур возвращается.

Вопрос заключается в том, как лучше всего передать параметры подключения в getConnection?
Брать из файла jdbc.properties или можно как-то из dataSource?

Нашел решение Здесь - Стоит ли выбрать этот вариант?
Но там файл с настройками должен находиться в папке resources. Не создавать же два одинаковых файла с настройками в папках WEB-INF и resources.

Как лучше всего сделать? Можно ли параметры взять из dataSource?
...
Рейтинг: 0 / 0
23.10.2014, 15:03
    #38785548
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
wvetalВ файле spring-servlet.xml инициализация подключения:
Код: xml
1.
	<bean id="dataSource" 



Это "источник данных", а не "подключение".


wvetalПодключение делаю так:
Код: java
1.
2.
			Class.forName("oracle.jdbc.OracleDriver");
			con = DriverManager.getConnection ("jdbc:oracle:thin:@10.0.0.10:1521:xe", "user", "password");



Просто потому что так захотелось, а не по какой-то объективной причине?

wvetalВопрос заключается в том, как лучше всего передать параметры подключения в getConnection?
Брать из файла jdbc.properties или можно как-то из dataSource?

Какие ещё параметры? DataSource.getConnection() чем не устраивает???
...
Рейтинг: 0 / 0
23.10.2014, 16:33
    #38785777
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
BlazkowiczКакие ещё параметры? DataSource.getConnection() чем не устраивает???
Спасибо за подсказку, сделал так - установил соединение...
Но, вылезло другое:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
	@Override
	public double getPayment(int district, int account, BasicDataSource dataSource) {
		
		Locale.setDefault(Locale.ENGLISH);
		Connection con = null;

		try {
			
			///Class.forName("oracle.jdbc.OracleDriver");
			///con = DriverManager.getConnection ("jdbc:oracle:thin:@10.0.0.10:1521:xe", "user", "password");
			con = dataSource.getConnection();
			
			con.setAutoCommit(false);

			String query = "{ call view.getPayment( ?, ?, ? ) }";
		
	        CallableStatement cs = con.prepareCall( query );
			///DelegatingCallableStatement cs = (DelegatingCallableStatement) con.prepareCall( query );
	        
	        cs.setBigDecimal( 1,new BigDecimal("300") );
	        cs.setBigDecimal( 2, new BigDecimal("100") );
	        cs.registerOutParameter(3, OracleTypes.CURSOR);
	        cs.execute();
	        
	        ResultSet results = ((OracleCallableStatement)cs).getCursor(3);  //на этой строчке бросает исключение
                                                                            //java.lang.ClassCastException:  
   //org.apache.commons.dbcp.DelegatingCallableStatement cannot be cast to oracle.jdbc.OracleCallableStatement


	        ///ResultSet results = ((DelegatingCallableStatement)cs).getCursor(3);  //а если делаю так - нет метода getCursor
	         
	        //...
	        int count = 0;
	        
			while (results.next ())
			{
				count++; 
				System.out.println(results.getBigDecimal("sum"));
			}
	        //...
	                
	    }
	    catch (Exception e) { 
	    	e.printStackTrace();
	    }
		finally{
			try {
				con.close();
			} catch (SQLException e) {
			}
		}
		
		return 2500;
	}


Вылетает исключение на строчке:
ResultSet results = ((OracleCallableStatement)cs).getCursor(3); //на этой строчке бросает исключение
//java.lang.ClassCastException:
//org.apache.commons.dbcp.DelegatingCallableStatement cannot be cast to oracle.jdbc.OracleCallableStatement
...
Рейтинг: 0 / 0
23.10.2014, 16:40
    #38785790
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
Пул оборачивает все JDBC классы своими.
Поэтому DelegatingCallableStatement.getDelegate() и там будет OracleCallableStatement
...
Рейтинг: 0 / 0
23.10.2014, 17:34
    #38785868
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
BlazkowiczПул оборачивает все JDBC классы своими.
Поэтому DelegatingCallableStatement.getDelegate() и там будет OracleCallableStatementСпасибо. Все получилось.

Выложу код, может кому-то пригодится:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
	@Override
	public double getPayment(int district, int account, BasicDataSource dataSource) {
		
		Locale.setDefault(Locale.ENGLISH);
		Connection con = null;

		try {
			//Class.forName("oracle.jdbc.OracleDriver");
			//con = DriverManager.getConnection ("jdbc:oracle:thin:@10.0.0.10:1521:xe", "user", "password");
			con = dataSource.getConnection();			
			con.setAutoCommit(false);

			String query = "{ call view.getPayment( ?, ?, ? ) }";
		
	        CallableStatement cs = con.prepareCall( query );
	        
	        cs.setBigDecimal( 1,new BigDecimal("300") );
	        cs.setBigDecimal( 2, new BigDecimal("100") );
	        cs.registerOutParameter(3, OracleTypes.CURSOR);
	        cs.execute();
	         
	        DelegatingCallableStatement theDelegatingCallableStatement = (DelegatingCallableStatement)cs;        
	        OracleCallableStatement theOracleStatement = 
	        		( OracleCallableStatement ) (theDelegatingCallableStatement.getDelegate());	        
	        ResultSet results = theOracleStatement.getCursor(3);
     
	        int count = 0;
			while (results.next ())
			{
				count++; 
				System.out.println(results.getBigDecimal("sum"));
			}
	        
	    }
	    catch (Exception e) { 
	    	e.printStackTrace();
	    }
		finally{
			try {
				con.close();
			} catch (SQLException e) {
			}
		}
			
		return 2500;
	}
...
Рейтинг: 0 / 0
23.10.2014, 18:04
    #38785910
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
wvetal,

смотря какая версия DBCP, но можно и так
OracleCallableStatement theOracleStatement = cs.unwrap(OracleCallableStatement.class);
...
Рейтинг: 0 / 0
24.10.2014, 12:49
    #38786558
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring. Подключение к базе. Чтение properties.
wvetalКак лучше всего сделать? Можно ли параметры взять из dataSource?

ДА!
Использовать Spring JdbcTemplate.

Код: xml
1.
2.
3.
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg type="javax.sql.DataSource" ref="dataSource"/>
    </bean>



Работает, так же как с JDBC, только без обвязки try{}catch{}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring. Подключение к базе. Чтение properties. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]