{"id":51797,"date":"2025-08-22T06:35:52","date_gmt":"2025-08-22T06:35:52","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=51797"},"modified":"2025-08-22T06:35:52","modified_gmt":"2025-08-22T06:35:52","slug":"complete-guide-for-socket-based-vs-tcp-based-application-connection","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/complete-guide-for-socket-based-vs-tcp-based-application-connection\/","title":{"rendered":"Complete Guide for Socket based vs TCP Based Application Connection"},"content":{"rendered":"\n<p>Here\u2019s a clear, end-to-end tutorial you can keep handy. It explains <strong>what \u201csocket-based\u201d vs \u201cTCP-based\u201d<\/strong> really means, how to <strong>tell which one you\u2019re using<\/strong>, and how to <strong>configure apps<\/strong> for each\u2014using our <strong>Keycloak \u2194 MySQL (XAMPP\/LAMPP)<\/strong> case as the running example.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Concept: Socket-based vs TCP-based<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Two different \u201cpipes\u201d your app can use to talk to a service (like MySQL)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>UNIX domain socket (UDS)<\/strong>\n<ul class=\"wp-block-list\">\n<li>A <strong>special file<\/strong> on disk (e.g. <code>\/opt\/lampp\/var\/mysql\/mysql.sock<\/code>).<\/li>\n\n\n\n<li>Only works <strong>on the same machine<\/strong>.<\/li>\n\n\n\n<li>Low overhead (skips the TCP\/IP stack) \u2192 <strong>slightly faster<\/strong> and very common on local servers.<\/li>\n\n\n\n<li>Access control via <strong>filesystem permissions<\/strong> + DB auth.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>TCP\/IP socket<\/strong>\n<ul class=\"wp-block-list\">\n<li>A network endpoint like <code>127.0.0.1:3306<\/code> or <code>10.0.0.5:3306<\/code>.<\/li>\n\n\n\n<li>Works <strong>locally and remotely<\/strong>.<\/li>\n\n\n\n<li>A tad more overhead but universally supported by drivers and load balancers.<\/li>\n\n\n\n<li>Access control via <strong>firewall\/bind address<\/strong> + DB auth.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mental model<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&#91; App ] --(UDS file)--&gt; &#91;<span class=\"hljs-regexp\">\/var\/<\/span>run\/...\/mysql.sock]  (local only)\n&#91; App ] --(TCP port)--&gt; &#91;<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span>:<span class=\"hljs-number\">3306<\/span>]          (local\/remote)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Many servers (MySQL\/MariaDB, Nginx, Redis, etc.) can expose <strong>both<\/strong> at the same time.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">How clients decide which one they\u2019re using<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MySQL CLI<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>mysql -h 127.0.0.1 ...<\/code> \u2192 <strong>TCP<\/strong><\/li>\n\n\n\n<li><code>mysql -S \/path\/to\/mysql.sock ...<\/code> \u2192 <strong>UNIX socket<\/strong><\/li>\n\n\n\n<li><code>mysql -h localhost ...<\/code> \u2192 varies by distro\/driver (often <strong>socket<\/strong> on Linux)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>JDBC (Java)<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>TCP<\/strong>: <code>jdbc:mysql:\/\/127.0.0.1:3306\/db<\/code> (MySQL driver)<\/li>\n\n\n\n<li><strong>Socket<\/strong> (Java): use a driver that supports it (e.g., <strong>MariaDB Connector\/J<\/strong>):<br><code>jdbc:mariadb:\/\/localhost:3306\/db?localSocket=\/path\/to\/mysql.sock<\/code><\/li>\n\n\n\n<li>If you pass a UDS parameter the driver doesn\u2019t support, it <strong>falls back to TCP<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Other client libs<\/strong> (quick cheatsheet below) often accept <code>socketPath<\/code> \/ <code>unix_socket<\/code> \/ <code>unixSocket<\/code> parameters.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">How to check which one is actually in use<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">On the <strong>server<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Is the service listening on <strong>TCP 3306<\/strong>?<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">ss -lntp | grep <span class=\"hljs-number\">3306<\/span>   <span class=\"hljs-comment\"># or: netstat -plnt | grep 3306<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>If you see <code>LISTEN ... 127.0.0.1:3306<\/code> (or <code>0.0.0.0:3306<\/code>) \u2192 <strong>TCP is enabled<\/strong>.<\/li>\n\n\n\n<li>If nothing prints \u2192 likely <strong>socket-only<\/strong>.<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Does the <strong>socket file<\/strong> exist?<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls -l \/opt\/lampp\/<span class=\"hljs-keyword\">var<\/span>\/mysql\/mysql.sock\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>If present and MySQL is running \u2192 <strong>socket is enabled<\/strong>.<\/li>\n<\/ul>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Ask MySQL itself:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SHOW VARIABLES LIKE <span class=\"hljs-string\">'socket'<\/span>;\nSHOW VARIABLES LIKE <span class=\"hljs-string\">'port'<\/span>;\nSHOW VARIABLES LIKE <span class=\"hljs-string\">'bind_address'<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">From the <strong>client\/app<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Try both ways explicitly:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># TCP<\/span>\n\/opt\/lampp\/bin\/mysql -h <span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span> -P <span class=\"hljs-number\">3306<\/span> -u USER -p DB -e <span class=\"hljs-string\">\"SELECT 1;\"<\/span>\n\n<span class=\"hljs-comment\"># Socket<\/span>\n\/opt\/lampp\/bin\/mysql -S \/opt\/lampp\/<span class=\"hljs-keyword\">var<\/span>\/mysql\/mysql.sock -u USER -p DB -e <span class=\"hljs-string\">\"SELECT 1;\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Logs &amp; driver names<\/strong>\n<ul class=\"wp-block-list\">\n<li>Java stack traces that mention <code>**com.mysql.cj**...<\/code> = MySQL Connector\/J.<\/li>\n\n\n\n<li>Java stack traces that mention <code>**org.mariadb.jdbc**...<\/code> = MariaDB Connector\/J.<\/li>\n\n\n\n<li>\u201c<strong>Driver does not support provided URL<\/strong>\u201d usually means the driver family doesn\u2019t match your JDBC URL scheme.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>See open files\/sockets<\/strong> of a running process:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">pid=$(pgrep -f <span class=\"hljs-string\">'org.keycloak.quarkus'<\/span> || <span class=\"hljs-literal\">true<\/span>)\n&#91; -n <span class=\"hljs-string\">\"$pid\"<\/span> ] &amp;&amp; sudo lsof -p <span class=\"hljs-string\">\"$pid\"<\/span> | egrep <span class=\"hljs-string\">'mysql-connector-j|mariadb-java-client|mysql.sock|TCP'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Configure the <strong>server<\/strong> for each mode (MySQL\/MariaDB)<\/h1>\n\n\n\n<p>File: <code>\/opt\/lampp\/etc\/my.cnf<\/code> (XAMPP\/LAMPP), under <code>[mysqld]<\/code>:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enable \/ tune <strong>UNIX socket<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">socket=\/opt\/lampp\/<span class=\"hljs-keyword\">var<\/span>\/mysql\/mysql.sock\n<span class=\"hljs-comment\"># (this is default in XAMPP; usually already set)<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Restart:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo \/opt\/lampp\/lampp restartmysql\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Enable <strong>TCP<\/strong> listening<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">bind-address=<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span>   <span class=\"hljs-comment\"># or 0.0.0.0 if remote access is needed<\/span>\n<span class=\"hljs-comment\"># ensure there is NO 'skip-networking'<\/span>\nport=<span class=\"hljs-number\">3306<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Restart &amp; verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo \/opt\/lampp\/lampp restartmysql\nss -lntp | grep 3306\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Configure <strong>applications<\/strong> for each mode<\/h1>\n\n\n\n<p>Below are proven patterns (including the exact ones you used today).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Keycloak (Quarkus 17+)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">A) <strong>TCP<\/strong> (production-friendly)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># conf\/keycloak.conf<\/span>\ndb=mysql\ndb-url=jdbc:mysql:<span class=\"hljs-comment\">\/\/127.0.0.1:3306\/keycloak_db?useSSL=false&amp;allowPublicKeyRetrieval=true<\/span>\ndb-username=keycloak\n<span class=\"hljs-comment\"># put the password in env to avoid parsing issues with '#'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> KC_DB_PASSWORD=<span class=\"hljs-string\">'Strong#Passw0rd!'<\/span>\nbin\/kc.sh build\nbin\/kc.sh start --optimized\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">B) <strong>UNIX socket<\/strong> (local same-host; requires driver that supports it)<\/h3>\n\n\n\n<p>Use <strong>MariaDB Connector\/J<\/strong> (already present in your install):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># conf\/keycloak.conf<\/span>\ndb=mariadb\ndb-url=jdbc:mariadb:<span class=\"hljs-comment\">\/\/localhost:3306\/keycloak_db?localSocket=\/opt\/lampp\/var\/mysql\/mysql.sock<\/span>\ndb-username=root\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> KC_DB_PASSWORD=<span class=\"hljs-string\">'Hs?gb?S345?3#s'<\/span>\nbin\/kc.sh build\nbin\/kc.sh start-dev\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Why your earlier fix worked: setting <code>KC_DB=mariadb<\/code> + <code>jdbc:mariadb:\/\/...localSocket=...<\/code> made Keycloak load the <strong>MariaDB<\/strong> driver, which <strong>does<\/strong> speak UNIX sockets natively.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PHP (PDO)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ TCP<\/span>\n$pdo = <span class=\"hljs-keyword\">new<\/span> PDO(<span class=\"hljs-string\">'mysql:host=127.0.0.1;port=3306;dbname=keycloak_db'<\/span>, <span class=\"hljs-string\">'user'<\/span>, <span class=\"hljs-string\">'pass'<\/span>);\n\n<span class=\"hljs-comment\">\/\/ UNIX socket<\/span>\n$pdo = <span class=\"hljs-keyword\">new<\/span> PDO(<span class=\"hljs-string\">'mysql:unix_socket=\/opt\/lampp\/var\/mysql\/mysql.sock;dbname=keycloak_db'<\/span>, <span class=\"hljs-string\">'user'<\/span>, <span class=\"hljs-string\">'pass'<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Node.js (mysql2)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ TCP<\/span>\ncreateConnection({ <span class=\"hljs-attr\">host<\/span>: <span class=\"hljs-string\">'127.0.0.1'<\/span>, <span class=\"hljs-attr\">port<\/span>: <span class=\"hljs-number\">3306<\/span>, <span class=\"hljs-attr\">user<\/span>: <span class=\"hljs-string\">'user'<\/span>, <span class=\"hljs-attr\">password<\/span>: <span class=\"hljs-string\">'pass'<\/span>, <span class=\"hljs-attr\">database<\/span>: <span class=\"hljs-string\">'keycloak_db'<\/span> });\n\n<span class=\"hljs-comment\">\/\/ UNIX socket<\/span>\ncreateConnection({ <span class=\"hljs-attr\">socketPath<\/span>: <span class=\"hljs-string\">'\/opt\/lampp\/var\/mysql\/mysql.sock'<\/span>, <span class=\"hljs-attr\">user<\/span>: <span class=\"hljs-string\">'user'<\/span>, <span class=\"hljs-attr\">password<\/span>: <span class=\"hljs-string\">'pass'<\/span>, <span class=\"hljs-attr\">database<\/span>: <span class=\"hljs-string\">'keycloak_db'<\/span> });\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Python (PyMySQL \/ mysqlclient)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># TCP<\/span>\npymysql.connect(host=<span class=\"hljs-string\">'127.0.0.1'<\/span>, port=<span class=\"hljs-number\">3306<\/span>, user=<span class=\"hljs-string\">'user'<\/span>, password=<span class=\"hljs-string\">'pass'<\/span>, db=<span class=\"hljs-string\">'keycloak_db'<\/span>)\n\n<span class=\"hljs-comment\"># UNIX socket<\/span>\npymysql.connect(unix_socket=<span class=\"hljs-string\">'\/opt\/lampp\/var\/mysql\/mysql.sock'<\/span>, user=<span class=\"hljs-string\">'user'<\/span>, password=<span class=\"hljs-string\">'pass'<\/span>, db=<span class=\"hljs-string\">'keycloak_db'<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Go (go-sql-driver\/mysql)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ TCP<\/span>\n<span class=\"hljs-attr\">dsn<\/span> := <span class=\"hljs-string\">\"user:pass@tcp(127.0.0.1:3306)\/keycloak_db?parseTime=true\"<\/span>\n\n<span class=\"hljs-comment\">\/\/ UNIX socket<\/span>\n<span class=\"hljs-attr\">dsn<\/span> := <span class=\"hljs-string\">\"user:pass@unix(\/opt\/lampp\/var\/mysql\/mysql.sock)\/keycloak_db?parseTime=true\"<\/span>\ndb, <span class=\"hljs-attr\">_<\/span> := sql.Open(<span class=\"hljs-string\">\"mysql\"<\/span>, dsn)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Decision guide: which should I use?<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use UNIX socket<\/strong> when:\n<ul class=\"wp-block-list\">\n<li>The app and DB are <strong>on the same host<\/strong>, and you want <strong>simplicity + a tiny perf edge<\/strong>.<\/li>\n\n\n\n<li>Your driver supports it easily (e.g., MariaDB Connector\/J).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Use TCP<\/strong> when:\n<ul class=\"wp-block-list\">\n<li>You might run the DB <strong>remotely, in containers, or behind a proxy<\/strong>.<\/li>\n\n\n\n<li>You need universal compatibility and predictable behavior across drivers.<\/li>\n\n\n\n<li>You want to use <strong>firewalls<\/strong>, <strong>VPCs<\/strong>, or <strong>TLS on the wire<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Common errors \u2192 what they mean \u2192 how to fix<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Error\/Log text<\/th><th>Meaning<\/th><th>Fix<\/th><\/tr><\/thead><tbody><tr><td><code>Connection refused<\/code><\/td><td>App tried <strong>TCP<\/strong>, but nothing is listening on that IP:port<\/td><td>Enable TCP (<code>bind-address<\/code>, <code>port<\/code>), or switch app to socket URL<\/td><\/tr><tr><td><code>Communications link failure<\/code><\/td><td>Can\u2019t reach server over TCP (firewall\/offline\/bad host)<\/td><td>Verify <code>ss -lntp<\/code>, network path, host\/port<\/td><\/tr><tr><td><code>Driver does not support provided URL<\/code><\/td><td>Driver family mismatched with URL (MySQL vs MariaDB)<\/td><td>Align: <code>db=mysql<\/code> + <code>jdbc:mysql:\/\/...<\/code> <strong>or<\/strong> <code>db=mariadb<\/code> + <code>jdbc:mariadb:\/\/...<\/code><\/td><\/tr><tr><td><code>Access denied for user<\/code><\/td><td>Auth\/host rules don\u2019t match<\/td><td>Ensure grants match the host: <code>'user'@'127.0.0.1'<\/code> for TCP; <code>'user'@'localhost'<\/code> often for socket<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">One-shot <strong>diagnostic script<\/strong> (copy-paste)<\/h1>\n\n\n\n<p>This tells you, in plain English, which paths are available and which work:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nSOCK=<span class=\"hljs-string\">\"\/opt\/lampp\/var\/mysql\/mysql.sock\"<\/span>\nDB=<span class=\"hljs-string\">\"keycloak_db\"<\/span>; U=<span class=\"hljs-string\">\"root\"<\/span>; H=<span class=\"hljs-string\">\"127.0.0.1\"<\/span>; P=<span class=\"hljs-number\">3306<\/span>\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"=== Server-side checks ===\"<\/span>\n<span class=\"hljs-keyword\">if<\/span> ss -lntp | grep -q <span class=\"hljs-string\">\":$P \"<\/span>; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"TCP: MySQL is listening on $H:$P\"<\/span>\n<span class=\"hljs-keyword\">else<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"TCP: Nothing listening on port $P\"<\/span>\nfi\n\n<span class=\"hljs-keyword\">if<\/span> &#91; -S <span class=\"hljs-string\">\"$SOCK\"<\/span> ]; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"UDS: Socket exists at $SOCK\"<\/span>\n<span class=\"hljs-keyword\">else<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"UDS: Socket file not found at $SOCK\"<\/span>\nfi\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"=== Client connectivity tests ===\"<\/span>\n<span class=\"hljs-keyword\">if<\/span> \/opt\/lampp\/bin\/mysql -h <span class=\"hljs-string\">\"$H\"<\/span> -P <span class=\"hljs-string\">\"$P\"<\/span> -u <span class=\"hljs-string\">\"$U\"<\/span> -e <span class=\"hljs-string\">\"SELECT 1;\"<\/span> &gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-number\">2<\/span>&gt;&amp;<span class=\"hljs-number\">1<\/span>; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"TCP: Client can connect to $H:$P as $U\"<\/span>\n<span class=\"hljs-keyword\">else<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"TCP: Client CANNOT connect to $H:$P as $U\"<\/span>\nfi\n\n<span class=\"hljs-keyword\">if<\/span> &#91; -S <span class=\"hljs-string\">\"$SOCK\"<\/span> ]; then\n  <span class=\"hljs-keyword\">if<\/span> \/opt\/lampp\/bin\/mysql -S <span class=\"hljs-string\">\"$SOCK\"<\/span> -u <span class=\"hljs-string\">\"$U\"<\/span> -e <span class=\"hljs-string\">\"SELECT 1;\"<\/span> &gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-number\">2<\/span>&gt;&amp;<span class=\"hljs-number\">1<\/span>; then\n    <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"UDS: Client can connect via $SOCK as $U\"<\/span>\n  <span class=\"hljs-keyword\">else<\/span>\n    <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"UDS: Client CANNOT connect via $SOCK as $U\"<\/span>\n  fi\nfi\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Case study (what we fixed today)<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Your MySQL (XAMPP) was effectively <strong>socket-only<\/strong> \u2192 TCP attempts from Keycloak failed with <code>Connection refused<\/code>.<\/li>\n\n\n\n<li>Switching Keycloak to <strong>MariaDB Connector\/J<\/strong> and using<br><code>jdbc:mariadb:\/\/localhost:3306\/keycloak_db?localSocket=\/opt\/lampp\/var\/mysql\/mysql.sock<\/code><br>worked immediately.<\/li>\n\n\n\n<li>Key insight: <strong>Match the driver family to the URL<\/strong>, and <strong>be explicit<\/strong> about socket vs TCP.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Quick reference (cheat sheet)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Check TCP<\/strong>: <code>ss -lntp | grep 3306<\/code><\/li>\n\n\n\n<li><strong>Check socket<\/strong>: <code>ls -l \/opt\/lampp\/var\/mysql\/mysql.sock<\/code><\/li>\n\n\n\n<li><strong>Force TCP (CLI)<\/strong>: <code>mysql -h 127.0.0.1 -P 3306 ...<\/code><\/li>\n\n\n\n<li><strong>Force socket (CLI)<\/strong>: <code>mysql -S \/path\/to\/mysql.sock ...<\/code><\/li>\n\n\n\n<li><strong>Keycloak TCP<\/strong>: <code>db=mysql<\/code> + <code>jdbc:mysql:\/\/127.0.0.1:3306\/...<\/code><\/li>\n\n\n\n<li><strong>Keycloak socket<\/strong>: <code>db=mariadb<\/code> + <code>jdbc:mariadb:\/\/localhost:3306\/...localSocket=...<\/code><\/li>\n\n\n\n<li><strong>Env beats file<\/strong>: CLI > ENV > <code>keycloak.conf<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a clear, end-to-end tutorial you can keep handy. It explains what \u201csocket-based\u201d vs \u201cTCP-based\u201d really means, how to tell which one you\u2019re using, and how to configure apps for&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-51797","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=51797"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51797\/revisions"}],"predecessor-version":[{"id":51798,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51797\/revisions\/51798"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=51797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=51797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=51797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}