2010-09-22 3 views
6

Можно ли подключить сокет Unix к MySql с Java, чтобы избежать накладных расходов JDBC TCP/IP?Подключение к Unix-сокету с MySql с Java, чтобы избежать чрезмерных затрат на TCP/IP JDBC?

Кто-нибудь знает библиотеку (или несколько библиотек, возможно), которая делает это возможным?

+0

Возможно, вы захотите перенести MySQL C API http://dev.mysql.com/doc/refman/5.0/en/c.html на Java с помощью Swig http://www.swig.org/. Если у вас есть время, и если все это стоит :) – Joset

+0

Я думаю, что вы придерживаетесь того же подхода, что и я, если вы не хотите, чтобы сервер mysql подвергался воздействию Интернета ... используйте iptables и т. Д. заблокировать порт, но локальные приложения все равно могут получить доступ к брандмауэру. – ppostma1

+1

Я думаю, что оригинальным плакатом был разъем JDBC MySQL, который мог бы использовать локальный unix-сокет вместо TCP. Как отмечали другие, стандартный соединитель JDBC делает много умных вещей, и если вы не подтвердили, что сетевое соединение является узким местом, вы рискуете преждевременной оптимизацией. Я не вижу стандартного способа использования сокетов в соединителе JDBC MySQL для этого. – mdoar

ответ

0

Вы всегда можете взять библиотеку C и обернуть ее самостоятельно. Я думаю, он поддерживает UNIX-сокеты.

Могу ли я спросить, как вы определили накладные расходы TCP/IP, чтобы быть проблемой? Как вы сузили проблему (что я предполагаю, что у вас есть) до этого?

Проблема связана только с накладными расходами на соединение в отличие от накладных расходов на пакет? Если установление соединений происходит слишком долго, библиотека объединения пулов (например, таковая в Apache commons) будет обрабатывать это для вас.

1

Кроме того, драйвер mySQL JDBC был отполирован в течение длительного периода времени и имеет несколько оптимизационных твиков, таких как кеширование метаданных. Я был бы удивлен тем, что разработчики JDBC оставили бы много издержек TCP/IP в драйвере.

Переход на JNI на реализацию на основе C, вероятно, будет стоить дороже, если вы перейдете на собственный код, чем это может быть достигнуто за счет сокращения расходов на TCP/IP.

Если вы действительно хотите вырезать служебные данные TCP/IP, вы можете использовать встроенную базу данных, такую ​​как sqlite, derby или гиперзвуковое.

+1

'Я был бы удивлен, что разработчики JDBC оставили бы много накладных расходов TCP/IP в драйвере.' Как я должен понимать это? Как разработчики JDBC влияют на TCP/IP? – hek2mgl

+1

Я имею в виду, что разработчики драйвера mySQL JDBC настроили сетевой код, чтобы избежать ненужных накладных расходов при использовании TCP. Когда вы подключаетесь к порту на одном компьютере, ядро ​​пропускает много служебных данных, связанных с TCP/IP.С другой стороны, он по-прежнему является TCP/IP по сети loopback, и данные должны проходить через сетевые уровни. Разумеется, разработчики JDBC не могут влиять на TCP/IP вне того, что предоставляется Java API. Я был бы удивлен, если бы эти теоретические накладные расходы оказали бы существенное влияние, особенно с базой данных. –

1

JDBC - это только спецификация интерфейса. Он не добавляет накладные расходы TCP/IP. Если накладные расходы вызваны драйвером JDBC. Существуют также драйверы JDBC для хранения в базах данных памяти или файлов и вообще не используют TCP/IP.

Драйвер MYSQL JDBC является драйвером JDBC Type 4. Это означает, что он не использует собственный код для доступа к базе данных. Если у Java нет способа доступа к сокетам unix, драйвер также не сможет их использовать. [1]

Если вы действительно хотите использовать unix-сокет, возможно, возможно использовать драйвер ODBC MySQL, который, похоже, поддерживает сокеты unix, а затем использует мост JDBC-ODBC для доступа к нему с Java.

0

Просто используйте junixsocket, http://code.google.com/p/junixsocket/

Это JNI питание библиотеки, которая обеспечивает доступ к AF_UNIX сокетам с помощью стандартного Java API сокетов, а также поставляется с фабрикой соединений MySQL.

 Смежные вопросы

  • Нет связанных вопросов^_^