2012-07-03 15 views
1

grails (1.1.1)에서 groovy로 개발 된 응용 프로그램이 있습니다. 나는 다음과 같은 연결 설정Groovy Grails 응용 프로그램에 대한 MSSQL 서버 연결 시간 제한

을 가진 서비스 클래스를 정의한 다른 MS SQL 서버 2005에 연결하기위한 folows-

hibernate { 
cache.use_second_level_cache=true 
cache.use_query_cache=true 
cache.provider_class='com.opensymphony.oscache.hibernate.OSCacheProvider' 
} 

environments { 
development { 
    dataSource { 
        logSql = true 
     dbCreate = "update" // one of 'create', 'create-drop','update' 
        url = "jdbc:mysql://<dev-server-ip>:3306/<db-name>"       
    } 
} 
test { 
    dataSource { 
     dbCreate = "update" 
        url = "jdbc:mysql://<test-server-ip>:3306/<db-name>"       
    } 
} 
production { 
    dataSource { 
     dbCreate = "update"   
        url = "jdbc:mysql://<prod-server-ip>:3306/<db-name>"       
    } 
} 

으로 DataSource.groovy에 코드에서 MySQL 서버의 최대 절전 모드 수 있도록 풀링 된 구성 데이터 소스를 사용했습니다

def connection = Sql.newInstance(
     "jdbc:sqlserver://<mssql-db-server-ip>;databaseName=<db-name>", 
     '<username>', 
     '<password>', 
     'com.microsoft.sqlserver.jdbc.SQLServerDriver') 

이 연결은 풀링 된 연결이 아닙니다. 그리고이 연결을 사용하여 데이터를 검색 할 때마다 세션을 만듭니다. 그렇다면 서비스 클래스에서 풀링 된 연결을 생성하는 메커니즘이 있습니까?

나는 예외를 가지고

String pullData() { 
    def userId = "sample_user" 
def testData = connection.firstRow("select distinct (COLUMN_NAME1+' > '+replace(COLUMN_NAME2,' > ', '>')+' > '+COLUMN_NAME3+' > '+COLUMN_NAME4+' > '+EMAIL) testRow from VIEW_NAME where lower(substring(EMAIL,1,(select charindex('@',EMAIL))-1)) = lower(?)",[userId]) 

def myStringList = testData.testRow.split(' > ') 
def myTestDataList = myStringList[4].split('@') 
def email = myTestDataList[0] 
return email 
} 

같은 데이터 쿼리를 선택하려면이 MS SQL 서버 연결을 사용하여 서비스 클래스에서 쿼리를 실행

. 스택 추적은

org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.reflect.UndeclaredThrowableException 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) 
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at jcifs.http.NtlmHttpFilter.doFilter(NtlmHttpFilter.java:125) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:636) 
Caused by: java.lang.reflect.UndeclaredThrowableException 
at PullDataService$$EnhancerByCGLIB$$881a39b3.pullData(<generated>) 
at PullDataService$$FastClassByCGLIB$$f8a1c77f.invoke(<generated>) 
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) 
... 33 more 
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection timed out 
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368) 
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1355) 
at com.microsoft.sqlserver.jdbc.TDSChannel.write(IOBuffer.java:1548) 
at com.microsoft.sqlserver.jdbc.TDSWriter.flush(IOBuffer.java:2368) 
at com.microsoft.sqlserver.jdbc.TDSWriter.writePacket(IOBuffer.java:2270) 
at com.microsoft.sqlserver.jdbc.TDSWriter.endMessage(IOBuffer.java:1877) 
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4403) 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:386) 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338) 
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026) 
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416) 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185) 
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160) 
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:281) 
at PullDataService.pullData(PullDataService.groovy:38) 
at PullDataService$$FastClassByCGLIB$$7ff09ca7.invoke(<generated>) 
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) 
... 40 more 

입니다. 오랜 시간 동안 저를 괴롭 히고 있습니다. 어떤 제안이라도 받아 들일 만합니다. 미리 감사드립니다.

+0

여기에서 오류 메시지를 확인하십시오. 원인 : com.microsoft.sqlserver.jdbc.SQLServerException : 연결 시간이 초과되었습니다. 이 쿼리는 실행중인 쿼리가 너무 오래 걸려 시간 초과가 발생했기 때문에 발생한다고 가정합니다. 당신이 사용하고있는 where 절이 약간 미친 것처럼 보입니다. 속도를 높이기 위해 그것을 변경하십시오. – krock

+0

'@'앞에 이메일 부분을 분할해야합니다. 그렇게 할 수있는 간단한 방법이 있습니까? 예 : [email protected] 비교할 'abc'만 추출해야합니다. 감사합니다. –

답변

0

이 쿼리의 속도가 느려지는 경우가 두 가지 있습니다. 주로 여러 필드를 기반으로 문자열 열을 작성하고 그것에 별개를 호출합니다. 첫 번째 결과 만 사용하고 전자 메일 만 신경 쓰면 다른 열은 필요하지 않으므로 Distinct가 필요하지 않습니다. 다음과 같이 생각하십시오.

def userId = "sample_user".toLowerCase() 
    def testData = connection.firstRow("select top 1 EMAIL as email" + 
      " from VIEW_NAME" + 
      " where lower(EMAIL) like ?",[userId + "@%"]) 
    def email = testData?.email?.split('@')[0] 
    return email 

like 절로 인해 속도가 느려질 수 있지만 distinct를 사용하는 것보다 훨씬 빠를 수 있습니다.

보기/기본 테이블에 열을 추가하여 이메일 주소 열에 별도의 사용자 ID 열을 추가하는 것이 좋습니다.

+0

제안 해 주셔서 감사합니다. 그것은 많은 일이 단순한 방식으로 행해지는 것처럼 보입니다. 고맙습니다. –