What you have here is using the Singleton Pattern to ensure that all callers receive the same instance of the connection object. Sounds efficient to being with and, so long as your application is purely single-threaded and never tries to do more than one [database-related] thing at a time, it will probably work quite well. If this is a particularly long-running program (like, say, a Windows Service that runs 24x7), you might even consider adding some defensive code into this method to ensure that the connection is still "viable"; that the database hasn't been shut down for, say, nightly housekeeping since you last used the connection.
The problems start as soon as your program gains any kind of Parallelism, the sort of things that working with an event-driven User Interface does surprisingly well.
Now, your database connection might be in use, handling the processing of one event, while the user is clicking around the application, making more and more demands of your now-overloaded and blocked-up connection. Now your application is "seen" to be performing badly, because it can't do more than one thing at at time, which your users might expect.
Using more than database connection is these cases is "better".
Most operating systems will do connection pooling automatically for you, thereby making opening a new connection a lighter operation, but there's still a finite overhead involved. Pushing everything sequentially down the one connection is efficient; starting a new connection for each and every operation is not. You have to make a Judgement Call as to which way your application needs to go.
Not that you have to stick rigidly to that decision! The method that you have for providing your [Singleton] connection could be modified into a Factory; if you call it "every once in a while", it can return you the "one" connection object; if you call it in "rapid succession" or if it detects that the connection is "busy", then it might choose to return you a new one.
It all depends how much of a problem this causing you.