2014-09-18 3 views
4

Я использую MySQL, используя опцию --skip-networking в Linux.Соединение JDBC MySQL с использованием Unix Socket

Я пытаюсь подключить свое приложение на основе J2EE (используя сервлеты) к базе данных MySQL с помощью JDBC.

Раньше, когда я использую MySQL с опцией --skip-сети отключенным, я был подключения к базе данных:

Class.forName("com.mysql.jdbc.Driver"); 
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","myuser","mypassword"); 

После того, как позволил --skip-сетей вариант, Я пытался подключить его как:

Class.forName("com.mysql.jdbc.Driver"); 
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","myuser","mypassword"); 

Но это, кажется, не работает, и я получаю java.lang.NullPointerException когда я пытаюсь подключиться к базе данных в своем приложении.

После комментирования опции --skip-networking и использования старого оператора JDBC я могу подключиться к базе данных.

Я могу подключиться к базе данных с помощью командной строки mysql client с включенной опцией --skip-networking.

Может ли кто-нибудь сказать мне, как подключиться к базе данных от JDBC? Я попытался найти его, но не смог найти удовлетворительного ответа. Заранее спасибо.

+1

Вы используете Java> = 7 – sol4me

+0

Да Java 7.u65_2.5.2-1 –

+0

Можете ли вы опубликовать полный StackTrace bcoz я нахожусь на Linux и пытался подключиться к MySQL с использованием JDBC и он работает отлично – sol4me

ответ

5

Вы просто не можете этого сделать: драйвер JDBC MySQL поддерживает только TCP/IP и - на Windows - именованные каналы для подключения к базе данных. Поэтому указание --skip-networking не позволит вам использовать JDBC MySQL Connector/J вообще.

http://lists.mysql.com/java/8749 Смотрите также:

сам Java не поддерживает сокеты Unix, но так как вы на окнах, вы можете использовать именованные каналы, [..]

Мертвый -link в приведенном выше сообщении теперь http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

+0

Спасибо. Вы знаете, могут ли именованные каналы использоваться в Unix? Ссылка на сообщение, на которое вы ссылаетесь, кажется мертвой. Также вы можете порекомендовать любой другой соединитель, который поддерживает Supoort Unix-труб. Я пытался использовать параметр -skip-network для securtiy, возможно, используя опцию -bind-address для localhost и используя брандмауэр для блокировки всех входящих соединений как альтернатива, которую я где-то читал. –

+0

@AadityaBagga Я добавил эквивалентную ссылку в свой ответ. Namedpipes - afaik - специально для Windows, поэтому вы не можете использовать его в Unix. Взаимодействие на локальном хосте или использование брандмауэра действительно является хорошим вариантом для обеспечения безопасности сервера. –

+0

Спасибо, я проверю. Я также нашел ссылку https://dev.mysql.com/doc/refman/5.0/en/connecting.html, в которой перечислены некоторые опции для подключения. Маркировка как решена. –

6

Если вы хотите использовать UNIX-сокеты с разъемом Mysql JDBC/J, вам необходимо предоставить socketFactory.

jdbc:mysql:///?user=test&password=test&socketFactory=<classname>&<socket>=/tmp/mysql.sock

Так что это будет зависеть от реализации вы используете. По умолчанию Mysql не поставляется с какой-либо реализацией для этого, просто предоставляет пример для такого завода в его исходном коде.

Существует существующая библиотека Java-сокета UNIX с именем junixsocket, которая также имеет такую ​​реализацию класса socketFactory. Пример приведен в Connecting to a MySQL database via Unix Domain Sockets, который является частью их документации.


Вы можете найти больше Java UNIX библиотеки сокета альтернативы в соответствующей Q & Материал,:

+0

Thx для информации. –

2

Как another answer отметил, что это возможно (по крайней мере, в IntelliJ IDE) для использования гнездового соединения для Mysql JDBC Connector/J (я использую версию 5.1) без, для обеспечения розеткиFactory,

JDBC: MySQL: // локальный: 3306/database_name гнездо = ​​/ TMP/mysql.sock

+0

Это действительно показалось полезным, однако я не мог заставить его работать, и мне пришлось использовать junixsocket вместо –

+0

@MatteoTassinari. Возможно, Intellij IDE предоставляет некоторые дополнительные библиотеки для поддержки парамельного подхода «socket». – Devy

2

JDBC Driver из проекта MariaDB поддерживает сокеты Unix, оставаясь совместимым с разъемом MySQL/J JDBC. Пример jdbc url для драйвера MariaDB: jdbc:mariadb://localhost:3306/revmgt?localSocket=/var/run/mysqld/mysqld.sock

Следует отметить, что для этого требуется, в том числе, библиотека JNA, поскольку драйвер MariaDB использует внутренние сокеты через внутреннюю сеть JNA. Я видел улучшения скорости для связанных с процессором java-процессов при использовании сокетов домена unix. Я считаю, что это было в значительной степени из-за разгрузки работы от процесса java до собственного кода, освобождающего циклы процессора для уже обработанного Java-процессами с процессором.

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