복붙노트

[SCALA] 비동기 JDBC 호출 할 수 있습니까?

SCALA

비동기 JDBC 호출 할 수 있습니까?

나는 데이터베이스에 비동기 호출을 만들 수있는 방법이 있는지 궁금해?

예를 들어, 처리하는 데 시간이 오래 걸릴 큰 요청을했습니다 I, I는 요청을 보내고 요청 (리스너 / 콜백 또는 무언가를 전달하여) 값을 반환하는 알림을 수신 할 것인지 상상한다. 나는 데이터베이스가 답변을 기다리고 차단하고 싶지 않아요.

내가 스레드 풀을 사용하는이 확장되지 않기 때문에, 무거운 동시 요청의 경우이 스레드의 아주 많은 수를 생성하는 해결책이 있는지 생각하지 않는다.

우리는 네트워크 서버에 이런 종류의 문제에 직면하고 우리는 연결 당 하나 개의 스레드를 피하기 위해 선택 / 설문 조사 / epoll 파일 시스템 호출을 사용하여 솔루션을 발견했다. 난 그냥 데이터베이스 요청과 유사한 기능을하는 방법 궁금하네요?

노트 : 나는 FixedThreadPool를 사용하는 것이 좋은 해결 방법이 될 수 있음을 알고 있어요,하지만 난 아무도 (추가 스레드의 사용없이) 정말 비동기 시스템을 개발하지 않았다 것을 놀랐어요.

** 업데이트 ** 변통-mysql을 : 때문에 실제 실용적인 솔루션의 부족, 나는 도서관 (변통의 일부) 자신을 만들하기로 결정했다. 그것은 기본적으로 / 디코딩 MySQL의 요청 / 응답을 디코딩하고, 후드 변통 / 인 Netty를 사용합니다. 심지어 연결의 큰 숫자와 매우 잘 확장됩니다.

해결법

  1. ==============================

    1.누군가가 명확히 수 있습니다 - 나는 랩 JDBC는 배우, 집행 또는 여기에 도움이 될 수 있습니다 무엇에 호출 제안 된 방법 중 어느 방법을 이해하지 않습니다.

    누군가가 명확히 수 있습니다 - 나는 랩 JDBC는 배우, 집행 또는 여기에 도움이 될 수 있습니다 무엇에 호출 제안 된 방법 중 어느 방법을 이해하지 않습니다.

    확실히 기본적인 문제는 JDBC 작업이 소켓 IO에 차단하는 것입니다. 그것은이이 블록을 수행 할 때 스레드의은에 실행 - 이야기의 끝을. 무엇이든 포장 프레임 워크 당신은 하나 개의 스레드가 동시에 요청에 따라 차단 / 없음 유지되고 끝낼 것 사용을 선택합니다.

    기본 데이터베이스 드라이버 (MySQL은?) 소켓의 생성을 차단하는 수단을 제공하는 경우 그때는 JDBC API를 위에 비동기 이벤트 기반 데이터베이스 계층을 구축 할 수있을 것입니다 상상 (의 SocketFactory 참조) 그러나 우리는 캡슐화해야 할 것 전체 이벤트 중심의 외관 뒤에 JDBC, 그리고 (이 이벤트가 구동 될 것입니다 후) JDBC처럼 보이지 않는 것이라고 외관. 데이터베이스 처리는 호출자에게 다른 스레드에서 비동기 일어날 것, 그리고 당신은 스레드 선호도에 의존하지 않는 트랜잭션 관리 프로그램을 구축하는 방법을 해결해야 할 것이다.

    나는 단 한 번의 백그라운드 스레드 동시 JDBC 간부의의 부하를 처리 할 수 ​​있도록 것이라고 언급 접근 방식처럼 뭔가. 실제로 당신은 아마 여러 개의 코어를 사용할 수 있도록 스레드 풀을 실행하는 것입니다.

    당신의 전형적인 JDBC 동시성을 해결하고 넣어 간단 - (물론 나는 원래의 질문의 논리 선택기 패턴의 사용자없이 IO이 가능 소켓을 차단하여 시나리오에서 그 동시성을 의미하는 바로 응답에 코멘트 아니에요 적당한 크기의 연결 풀에서).

    MySQL을 것 같은데 아마 --- 내가 제안하고있어 라인을 따라 무언가를 http://code.google.com/p/async-mysql-connector/wiki/UsageExample

  2. ==============================

    2.그것은 JDBC를 통해 데이터베이스에 비동기 호출을하는 것은 불가능하지만 (통화가 끝났다 예는, 배우가 JDBC를 통해 DB에 호출을하고 제삼자에게 메시지를 전송) 배우와 JDBC하는 비동기 호출을 할 수 있습니다, 또는, 당신이 경우 파이프 라인 선물 (약속)와 CPS처럼 (좋은 구현 Scalaz의 약속입니다)

    그것은 JDBC를 통해 데이터베이스에 비동기 호출을하는 것은 불가능하지만 (통화가 끝났다 예는, 배우가 JDBC를 통해 DB에 호출을하고 제삼자에게 메시지를 전송) 배우와 JDBC하는 비동기 호출을 할 수 있습니다, 또는, 당신이 경우 파이프 라인 선물 (약속)와 CPS처럼 (좋은 구현 Scalaz의 약속입니다)

    연속 스케줄링 표준 JVM 설정에 배우의 수백만을 만들 수 있습니다 - 기본적으로 스칼라 관계자는 이벤트 기반 (스레드 기반되지 않음)입니다.

    당신이 자바를 대상으로하는 경우, Akka 프레임 워크는 자바와 스칼라 모두 좋은 API를 가지고있는 배우 모델 구현이다.

    그 외에, JDBC의 동기 성격은 나에게 완벽한 의미가 있습니다. 데이터베이스 세션의 비용은 지금까지 자바 스레드의 비용이 차단되는보다 높은 (중 하나 ...의 앞에 또는 배경)와 응답을 기다리고 있습니다. 쿼리는 실행 프로그램 서비스의 기능 (또는 포장 배우 / 동시성 프레임 워크 / 약속을 포크 - 조인) 당신을 위해 충분하지 않습니다 (당신은 너무 많은 스레드를 소비하고) 당신이 우선해야 대해 생각 오랫동안 실행하는 경우 데이터베이스로드. 일반적으로 데이터베이스로부터의 응답은 매우 빠르게 돌아오고, 고정 나사 풀과 백업 집행자 서비스는 충분히 좋은 솔루션입니다. 너무 많은 장기 실행 쿼리가있는 경우 선행 (전) 처리를 고려해야합니다 - 야간 데이터의 재 계산이나 뭐 그런 것처럼.

  3. ==============================

    3.아마 당신은, 꽤 잘 이럴 확장되는 JMS 비동기 메시징 시스템을 사용할 수 있습니다 :

    아마 당신은, 꽤 잘 이럴 확장되는 JMS 비동기 메시징 시스템을 사용할 수 있습니다 :

  4. ==============================

    4.이 JDBC의 직접적인 지원은하지 않습니다하지만 당신은 자바 5에서 여러 MDB 같은 옵션, 실행자 있습니다.

    이 JDBC의 직접적인 지원은하지 않습니다하지만 당신은 자바 5에서 여러 MDB 같은 옵션, 실행자 있습니다.

    "나는 스레드 풀을 사용하는가이 스레드의 아주 많은 수를 생성합니다 무거운 동시 요청의 경우, 확장되지 않기 때문에 해결책이 있는지 고려하지 않는다"고 말했다.

    나는 왜 스레드의 경계 풀을 확장하지 않을 것 궁금? 그것은 풀 스레드 당 요청하지 각 요청마다 스레드를 생성하는 것입니다. 나는 아주 가끔 무거운 부하 웹 애플리케이션에 대한이 사용하고있다 그리고 우리는 지금까지 모든 문제를 보지 못했다.

  5. ==============================

    5.작품에 "옆에 JDBC"그것은 새로운 비동기의 JDBC API처럼 보인다.

    작품에 "옆에 JDBC"그것은 새로운 비동기의 JDBC API처럼 보인다.

    여기에 프리젠 테이션을 참조하십시오

    당신은 여기에서 API를 다운로드 할 수 있습니다

  6. ==============================

    6.다른 답변에서 언급 한 바와 같이 JDBC API는 자연에 의해 비동기 없습니다. 당신이 작업의 일부와 다른 API와 함께 살 수있는 경우에는 솔루션이있다. 한 예로 https://github.com/jasync-sql/jasync-sql MySQL과 PostgreSQL을 위해 일하는 것입니다.

    다른 답변에서 언급 한 바와 같이 JDBC API는 자연에 의해 비동기 없습니다. 당신이 작업의 일부와 다른 API와 함께 살 수있는 경우에는 솔루션이있다. 한 예로 https://github.com/jasync-sql/jasync-sql MySQL과 PostgreSQL을 위해 일하는 것입니다.

  7. ==============================

    7.Ajdbc 프로젝트는이 문제 http://code.google.com/p/adbcj/ 답변을 보인다

    Ajdbc 프로젝트는이 문제 http://code.google.com/p/adbcj/ 답변을 보인다

    MySQL과 PostgreSQL을 현재 2 실험 기본적으로 비동기 드라이버가있다.

  8. ==============================

    8.오래된 질문,하지만 좀 더 정보를 제공합니다. 공급 업체 JDBC의 확장과 함께 JDBC를 처리 할 수있는 래퍼를 제공하지 않는 한, 데이터베이스 자체에 JDBC 문제 비동기 요청을 할 수 없습니다. 즉, 처리 큐 JDBC 자체를 포장하기 위해 하나 개 이상의 별도의 연결에서 대기열을 처리 할 수있는 로직을 구현하는 것이 가능했다. 통화의 몇 가지 유형이의 장점 중 하나는 논리가 무거운만큼 부하 경우, 상당히 논리를 속도를 높일 수 처리를위한 JDBC 배치,로 통화를 변환 할 수 있다는 것입니다. 이 데이터가 삽입되는 통화에 대한 가장 유용하며, 오류가있는 경우 실제 결과는 기록 될 필요가있다. 삽입은 사용자의 활동을 기록하기 위해 수행하는 경우이의 좋은 예입니다. 전화가 지금부터 몇 초 즉시 완료 또는 경우 응용 프로그램은 상관하지 않습니다.

    오래된 질문,하지만 좀 더 정보를 제공합니다. 공급 업체 JDBC의 확장과 함께 JDBC를 처리 할 수있는 래퍼를 제공하지 않는 한, 데이터베이스 자체에 JDBC 문제 비동기 요청을 할 수 없습니다. 즉, 처리 큐 JDBC 자체를 포장하기 위해 하나 개 이상의 별도의 연결에서 대기열을 처리 할 수있는 로직을 구현하는 것이 가능했다. 통화의 몇 가지 유형이의 장점 중 하나는 논리가 무거운만큼 부하 경우, 상당히 논리를 속도를 높일 수 처리를위한 JDBC 배치,로 통화를 변환 할 수 있다는 것입니다. 이 데이터가 삽입되는 통화에 대한 가장 유용하며, 오류가있는 경우 실제 결과는 기록 될 필요가있다. 삽입은 사용자의 활동을 기록하기 위해 수행하는 경우이의 좋은 예입니다. 전화가 지금부터 몇 초 즉시 완료 또는 경우 응용 프로그램은 상관하지 않습니다.

    사이드 참고로, 시장에서 하나 개의 제품은 내가 비동기 적으로 만들 수 설명한 것과 같은 비동기 호출을 허용하는 정책 중심의 접근 방식을 제공합니다 (http://www.heimdalldata.com/). 면책 조항 :이 회사의 공동 설립자입니다. 이 처리를 위해 함께 자동으로 그들을 배치 정규식은 / JDBC 어떤 데이터 소스에 대해 삽입물 삭제 / 갱신 등 데이터 변환 요청에 적용 할 수 있으며. MySQL을하고 rewriteBatchedStatements 옵션 (rewriteBatchedStatements와 MySQL과 JDBC = 참) 데이터베이스에이 할 수있는 상당히 낮은 전체 부하와 함께 사용하는 경우.

  9. ==============================

    9.당신은 내 의견에 세 가지 옵션이 있습니다 :

    당신은 내 의견에 세 가지 옵션이 있습니다 :

    면책 조항 : 나는 산호의 개발자 중 하나입니다.

  10. ==============================

    10.해결책은 표준 관계형 데이터베이스와 반응 연결이 가능하도록 개발되고있다.

    해결책은 표준 관계형 데이터베이스와 반응 연결이 가능하도록 개발되고있다.

  11. ==============================

    11.자바 5.0 집행 편리 올 수 있습니다.

    자바 5.0 집행 편리 올 수 있습니다.

    당신은 장기 실행 작업을 처리하는 스레드의 고정 번호를 가지고 있습니다. 그리고 대신의 Runnable의 당신은 결과를 반환 호출 가능을 사용할 수 있습니다. 결과는 미래 객체에 캡슐화되고, 그래서 다시 때 당신은 그것을 얻을 수 있습니다.

  12. ==============================

    12.여기에 비 차단 JDBC API는 오라클이 자바 원에서 발표에서처럼 보일 수 있는지에 대한 개요는 다음과 같습니다 https://static.rainfocus.com/oracle/oow16/sess/1461693351182001EmRq/ppt/CONF1578%2020160916.pdf

    여기에 비 차단 JDBC API는 오라클이 자바 원에서 발표에서처럼 보일 수 있는지에 대한 개요는 다음과 같습니다 https://static.rainfocus.com/oracle/oow16/sess/1461693351182001EmRq/ppt/CONF1578%2020160916.pdf

    그래서 결국, 진정한 비동기 JDBC 호출이 실제로 가능할 것으로 보인다.

  13. ==============================

    13.그냥 미친 생각 : 당신은 어떤 미래 / 약속에 싸여 JBDC 결과 집합 통해 Iteratee 패턴을 사용할 수 있습니다

    그냥 미친 생각 : 당신은 어떤 미래 / 약속에 싸여 JBDC 결과 집합 통해 Iteratee 패턴을 사용할 수 있습니다

    해머 스미스는 MongoDB를 위해이 작업을 수행합니다.

  14. ==============================

    14.난 그냥 여기에 아이디어를 생각하고있다. 왜 스레드를 가진 각 하나의 데이터베이스 연결 풀을 가질 수 없었다. 각 스레드는 큐에 액세스 할 수 있습니다. 당신은 시간이 오래 걸리는 쿼리를 수행 할 때 큐에 넣을 수 있습니다 다음 스레드 중 하나를 선택하고 그것을 처리합니다. 당신의 스레드의 수를 경계하기 때문에 너무 많은 스레드를하지 않습니다.

    난 그냥 여기에 아이디어를 생각하고있다. 왜 스레드를 가진 각 하나의 데이터베이스 연결 풀을 가질 수 없었다. 각 스레드는 큐에 액세스 할 수 있습니다. 당신은 시간이 오래 걸리는 쿼리를 수행 할 때 큐에 넣을 수 있습니다 다음 스레드 중 하나를 선택하고 그것을 처리합니다. 당신의 스레드의 수를 경계하기 때문에 너무 많은 스레드를하지 않습니다.

    편집 : 또는 스레드의 더 나은 아직, 단지 숫자. 스레드가 대기열에 무언가를 볼 때, 그것은 풀에서 연결을 요청하고 처리합니다.

  15. ==============================

    15.공유지 - dbutils 라이브러리는 당신에게 ExecutorService를 제공 ​​AsyncQueryRunner에 대한 지원을 가지고 있으며, 그것은 미래를 반환합니다. 그것을 사용하고 자원을 누설하지 않습니다 보장하기 간단로서 가치가 체크 아웃.

    공유지 - dbutils 라이브러리는 당신에게 ExecutorService를 제공 ​​AsyncQueryRunner에 대한 지원을 가지고 있으며, 그것은 미래를 반환합니다. 그것을 사용하고 자원을 누설하지 않습니다 보장하기 간단로서 가치가 체크 아웃.

  16. ==============================

    16.자바에 대한 비동기 데이터베이스 API에 관심이 있다면 당신은 CompletableFuture과 람다를 기반으로 표준 API의 집합을 마련하기위한 새로운 이니셔티브가 있다는 것을 알아야한다. 이러한 API를 연습하는 데 사용할 수있는 JDBC를 통해 이러한 API의 구현이있다 : https://github.com/oracle/oracle-db-examples/tree/master/java/AoJ Javadoc의는 GitHub의 프로젝트의 README에 언급되어있다.

    자바에 대한 비동기 데이터베이스 API에 관심이 있다면 당신은 CompletableFuture과 람다를 기반으로 표준 API의 집합을 마련하기위한 새로운 이니셔티브가 있다는 것을 알아야한다. 이러한 API를 연습하는 데 사용할 수있는 JDBC를 통해 이러한 API의 구현이있다 : https://github.com/oracle/oracle-db-examples/tree/master/java/AoJ Javadoc의는 GitHub의 프로젝트의 README에 언급되어있다.

  17. from https://stackoverflow.com/questions/4087696/is-asynchronous-jdbc-call-possible by cc-by-sa and MIT license