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

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

Проект на 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
Spring. Подключение к базе. Чтение properties.
    #38785548
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Spring. Подключение к базе. Чтение properties.
    #38785777
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Spring. Подключение к базе. Чтение properties.
    #38785790
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пул оборачивает все JDBC классы своими.
Поэтому DelegatingCallableStatement.getDelegate() и там будет OracleCallableStatement
...
Рейтинг: 0 / 0
Spring. Подключение к базе. Чтение properties.
    #38785868
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Spring. Подключение к базе. Чтение properties.
    #38785910
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal,

смотря какая версия DBCP, но можно и так
OracleCallableStatement theOracleStatement = cs.unwrap(OracleCallableStatement.class);
...
Рейтинг: 0 / 0
Spring. Подключение к базе. Чтение properties.
    #38786558
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring. Подключение к базе. Чтение properties.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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