DBConnection Compilation Error

hey,

i’m new to elixir so am very unfamiliar with how it all works

i am trying to connect to a MariaDB database using the mariaex driver

i’ve added it to the mix.exs file, as shown:

defmodule Backend.MixProject do
  use Mix.Project

  def project do
    [
      app: :backend,
      version: "0.1.0",
      elixir: "~> 1.9",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      mod: {Backend.Application, []},
      extra_applications: [:logger, :cowboy, :plug, :poison]
    ]
  end

  defp deps do
    [
      {:plug_cowboy, "~> 1.0.0"},
      {:poison, "~> 3.1"},
      {:mariaex, "~> 0.9.1"}
    ]
  end
end

…and i’ve also run mix deps.get

within the application.ex file (where Backend.Application is defined), i have included the line:

Mariaex.start_link(hostname: "localhost", port: "3307", username: "removed", password: "removed", database: "removed")

which according to the docs, should start a connection to the database

however when running iex -S mix in order to run the program, this compilation error is returned:

== Compilation error in file lib/backend/application.ex ==
** (exit) exited in: GenServer.call(DBConnection.Watcher, {:watch, DBConnection.ConnectionPool.Supervisor, {DBConnection.ConnectionPool.Pool, {#PID<0.190.0>, #Reference<0.1191833633.3142189059.94268>, Mariaex.Protocol, [hostname: "localhost", port: "3307", username: "removed", password: "removed", database: "removed"]}}}, :infinity)
    ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started

and i have no clue what to do to fix this, nor can i find any solutions

any pointers or suggestions for what i could do or try would be hugely appreciated

Can you please include the whole application file? You should start the connection to the database inside the start/2 function, typically as part of the supervision tree. Use mix new my_app —sup to have a better idea. Then, in children, you will do something like this:

{Mariaex, name: :my_app, password: …, …}
2 Likes

thanks for the response, this seems to work now:

defmodule Backend.Application do
  @moduledoc false

  use Application

  def start(_type, _args) do

    children = [
      Plug.Adapters.Cowboy.child_spec(scheme: :http, plug: Backend.Router, options: [port: 8085]),
      Mariaex.child_spec(hostname: "localhost", port: "3307", username: "removed", password: "removed", database: "removed")
    ]
    IO.puts("Worker started on port 8085")

    opts = [strategy: :one_for_one, name: Backend.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

i had called the Maria.start_link() function above the line use Application, which in hindsight seems like a very obvious and careless mistake now on my part

i’ve tried to write this in the way you said, i assume this is what you meant by “supervision tree”?

1 Like

Yes, that’s the way to go. I think you are only missing the name option, which you will pass as argument to Mariaex.query functions and similar.

1 Like