Wednesday, November 5, 2014

Spring, Pooling - tomcat, ORA

Connection Pool

ქონექშენ ფული აუცილებლად გვჭირდება მაშინ, როდესაც საქმე გვაქვს ისეთ აპლიკაციასთან, რომელსაც ბევრი მომხმარებელი იყენებს - წინასწარ ვამყარებთ კომნიკაციას ბაზასთან, წინასწარ გამოვყოფთ ამ უკანასკნელისთვის რესურსებს და ასე შემდეგ.

ალტერნატივები ბევრი გვაქვს, მაგალითად Apache commons DBCP, Tomcat DBCP, C3PO  და ასე შემდეგ. ამ სტატიაში კი tomcat ის DBCP ზე მინდა ვისაუბრო - ეს tomcat სერვერიც ძალიან მომწონს და მისი ფულინგის სისტემაც. ტომკატში dbcp ისტორია იწყება იმით რომ, მათ გააგრძელეს  commons DBCP ის დეველოპმენტი.. ამის მიზეზი კი ის იყო რომ commons -ს  საშინელი thread-safety პრობლემები ქონდა (ეს იხება 1.0, 1.2 ვერსიებს მაგალთად).. შესაბამისად ტომკატმა თავისი დეველოპმენტი დაიწყო, გადააკეთე ყველაფერი თავის გემოზე, common ის პრობლემებიც გაასწორა.. დღე დღეს მისდევდა, დრო კი არ ჩერდებოდა  - ტომკატი ყველანაირად ცდილობდა მაქსიმალურად ჩქარი ფულინგი გაეკეთებინა და ამასაც მიაღწია, ამასობაში Commons მაც გაასწორა თავისი პრობლემები და დააფაბლიშა ახალი ვერსია...  საბოლოოდ ასე მივიღეთ tomcat ის ალტერნატიული ფულინგ სისტემა, რომელის წინა პირობა რათქმაუნდა common ის dbcp იყო... ახალი და განსხვავებული, მორგებული ყველანაერად სერვერ...


Spring ში რამდენიმე ტიპის data source შეგვიძლია ავღწეროთ, ყველა org.springframework.jdbc.datasource პაკეტშია.

1. DriverManagerDataSource - ყოველ ჯერზე, როდესაც ქონექშენის მოთხოვნა მოუვა, აბრუნებს ახალ ქონექშენს. სამწუხაროდ, pool ინგი არ აქვს გაკეთებული.

2. SingleConnectionDataSource  - ყოველ ჯერზე ერთდაიგივე ქონექშენს აბრუნებს.

ორივე, ზემოთ აღწერილი, პატარა აპლიკაციებისთვის არის გათვლილი.

მოვიყვანოთ  კონფიგურაციის მაგალითი:

 
     <bean id="dataSource"  class=
      "org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value=
      "oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="${database.url}" /> 
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
    </bean> 


 
ახლა კი ტომკატის ფულინგ მექანიზმზე გადავიდეთ, რომელზეც ზემოთ ვსაუბრობდით. მე კონკრეტულად Oracle-ს ვუკავშირდები, და კონკრეტული კონფიგურაციების მნიშვნელობები .properties ფაილში მაქვს გაწერილი.

     <bean id="dataSource" class=
      "org.apache.tomcat.jdbc.pool.DataSource" 
      destroy-method="close">
        <property name="initialSize" value="${database.initialSize}" />
        <property name="maxActive" value="${database.maxActive}" />
        <property name="maxIdle" value="${database.maxIdle}" />
        <property name="minIdle" value="${database.minIdlel}" />
         <property name="driverClassName" 
      value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="${database.url}" /> 
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
     </bean>





ყველაეფრი ძალიან კარგადაა, თუმცა არ დაგავიწყდეთ ბაზის ის კონფიგურაცია. Pool ის გაკეთება კარგია მაგრამ ბაზასაც უნდა შეეძლოს რექუესთების მიღება.

პრიმიტიულ მაგალითს მოვიყვან, Oracle-ს შემთხვევაში.  შეამოწმეთ ბაზას რამდენი პროცესის დამუშავება შეუძლია ან job_queue_processes რამდენი გაქვთ მითითებული.

show parameter processes;

NAME                       TYPE        VALUE      
------------------------------------------- 
aq_tm_processes            integer     0          
db_writer_processes        integer     1          
gcs_server_processes       integer     0          
global_txn_processes       integer     1          
job_queue_processes        integer     5       
log_archive_max_processes  integer     4          
processes                  integer     10       



შეგიძლიათ შეცვალოთ მნიშვნელობები (ეს დამოკიდებულია თქვენი აპლიკაციის ტიპზე, თუ როგორი დატვირტვა ექნება ბაზასთან მიმართებაში):
ALTER SYSTEM SET processes=2000 SCOPE=SPFILE;

ALTER SYSTEM SET job_queue_processes=1000 scope=both;

პ.ს ბოლო ორი ALTER ის შემდეგ სერვერის რესტარტი არ დაგავიწყდეთ :)